2017-04-26 5 views
0

アルファベット文字が整数値に追加されたときにMySQLが誤検出を検出しないようにするにはどうすればよいですか?INT(11)フィールドのid = '2bar'はfalse positive id = 2を返します

CREATE TABLE `mytable` (
    `id` int(11) NOT NULL, 
    `name` varchar(255) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

ALTER TABLE `mytable` 
    ADD PRIMARY KEY (`id`); 

そして、このクエリ:

は、この表を与えていることが判明した結果id=2 OK働くと示し

SELECT * FROM `mytable` WHERE `id`='2' 

。しかし、私は、クエリで '2abc'の文字列値もその行を返すことに気づいた:偽陽性。私はむしろクエリが失敗し、それが見つからなかったことを示すようになりますidmytable ..

これは、クエリを実行する前に値が有効な整数であることを確認することで回避できますが、将来の目的で文字列と互換性があります。

+2

https://dba.stackexchange.com/questions/89760/prevent-mysql-from-mangling-queries-by-casting-string-to-intとhttp://stackoverflow.com/questionsを参照してください。/207082 53/prevent-mysql-casting-string-int-where-where節 –

+2

これは、文書https://dev.mysql.com/doc/refman/5.7/en/type-conversion.htmlに詳しく記載されています。 'これは、' 1 '、' 1 '、' 1a 'など、値1に変換される可能性があるさまざまな文字列が存在するためです。 '明示的な型キャストがなければ、文字列を整数に変換し、' 2abc'は2になり、 '2 = 2 => 'になります。これはサイレント変換' select' 2ab '+ 0; => 2 'しかし 'select' ab2 '+ 0 => 0' –

+0

@AbhikChakrabortyあなたが答えとしてあなたのコメントを追加すれば、私はあなたがクレジットを得るようにそれを受け入れます。 –

答えて

0

これはよくその理由は、1」のよう 値1に変換することができる多くの異なる文字列があることであるドキュメント https://dev.mysql.com/doc/refman/5.7/en/type-conversion.html

ラインのチェック

に記載されています'、' 1 '、' 1a 'のいずれかになります。それは文字列を整数に変換しますし、あなたのケースで2abcが2となり、2 = 2 => trueの場合、これはサイレント変換

select '2ab'+0; => 2

しかし

と呼ばれているキャスト明示的な型なしだから、

select 'ab2'+0 => 0

関連する問題