2016-08-03 4 views
0

誰もがユーザーの検索に基づいた検索結果のメッセージを表示しない方法MySQLの整数列が無効な結果を返す

、MySQLがクエリの行動を選択し、これを解決するために私を助ける理解するために私を助けてくださいことはできますか?

テーブルの構造:

CREATE TABLE `dummytable` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `mobile` int(11) NOT NULL, 
    `welcome` varchar(150) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 

enter image description here

質問:なぜ私はこの結果を取得していますか?

SELECT * FROM `dummytable` WHERE `mobile` = '\'\'' LIMIT 50 


enter image description here
+0

もし 'mobile' = 'okay'を追加した場合も同じ結果になります。誰でもこれを解決するのを助けることができる – Sundar

答えて

2

カラムmobileは整数として宣言されています。 MySQLが整数を文字列と比較すると、その文字列が数値に変換されます。

どのようにMySQLがこれを行いますか?先頭の数字を数値に変換します。あなたの条件は以下のとおりです。

WHERE mobile = '''' 

(文字列内の単一引用符を置くために、伝統的なSQLの方法はそれを倍増することである。)

単一引用符は、数字ではないので、0での変換結果。そして、それはあなたが得る結果です。

+0

これを解決する方法..人々が入力ボックスで大丈夫を検索している場合、結果は無効になります。これを解決するには、この場合、私は結果を表示する必要があります。 – Sundar

+0

データベース外の入力値をテストします。あなたはPHPから来ている場合は、そこでテストを行います。 – Marcus

1

お客様の列は整数列です。したがって、すべてがintに変換されます。空の文字列が0に変換されます(数字で始まらない任意の他の文字列でも、私が思うにゼロに変換されます)、MySQLはあなたに警告メッセージを示し、このクエリの実行後

+0

はい私たちが 'mobile' = 'okay'を追加した場合も、結果は同じです – Sundar

1

mysql> select * from foo where bar_integer='\'\'' 

.... 

10 rows in set, 1 warning (0.01 sec) 

mysql> show warnings; 
+---------+------+------------------------------------------+ 
| Level | Code | Message         | 
+---------+------+------------------------------------------+ 
| Warning | 1292 | Truncated incorrect DOUBLE value: 'okay' | 
+---------+------+------------------------------------------+ 

のMySQL文字列値を変換先の型(整数)に変換しようとします。変換が失敗すると、mysqlはそれを0と解釈して結果を表示します。

MySQL厳密モードを有効にすると、このクエリはこの暗黙のキャストを行う代わりにエラーを生成します。

+0

これを解決する方法..人々が入力ボックスで大丈夫を検索している場合、結果は無効になります。これを解決するには、この場合、結果が表示されないようにしてください。 – Sundar

+0

mysqlを照会する前に、クライアント側のユーザー入力を検証する必要があります。これはmysqlの問題ではありません。 –

関連する問題