2011-04-07 13 views
1

だから、ちょうどIDだけのテーブルがintであると言うことができます。私はそれを発見した:MySQLの整数比較で末尾のアルファベット文字が無視される

SELECT * 
FROM table 
WHERE ID = '32anystring'; 

明らかに32!= '32anystring'。

これは非常に奇妙なようです。それはなぜこれをするのですか?それはオフにすることはできますか?最善の回避策は何ですか?

答えて

2

文字列を数値に変換するときに、先行する数字を数値として解釈するのは、ほとんどのプログラミング言語で一般的な動作です。

これを処理するためのいくつかの方法があります。

使用して文を準備し、あなたが数値型である値を入れているプレースホルダを定義します。これにより、文字列がまったく入れられなくなります。

アプリケーションの上位層で入力を検証し、数字であることを確認します。

は(私はちょうど私が常にちょうどクエリを実行する前に、適切な検証システムを導入してきたように、実際にそれを試したことがない、これがうまくいくことを推測している)MySQLでBINARYキーワードを使用します -

SELECT * 
FROM table 
WHERE BINARY ID = '32anystring'; 
1

あなたが上で動作、または2つの異なるタイプを比較するときは、この

http://dev.mysql.com/doc/refman/5.1/en/type-conversion.html

  1. を読み取る必要がある、そのうちの一つは、他に変換されます。
  2. string-> number(可能な'1.23def' * 2 => 2.46)のMySQL変換は、有効な数値である限り、できるだけ文字列を解析します。最初の文字を数字の一部にすることができない場合、結果は0になります。
+0

これは(少なくとも私のバージョンでは)少し間違っています。 SELECT 'abc123def' * 2 => 0、先頭の文字を削除すると機能します。 – therealsix

+0

@therealsix /ありがとう。私はそれが最初のブロックで機能していると思った。 – RichardTheKiwi

関連する問題