2017-07-04 15 views
0

私は、MySQL(MySQLサーバ5.7)で、次の表を持っている:なぜvarcharと数値の比較がTrueを返すのですか?

CREATE TABLE IF NOT EXISTS SIMCards (
SIMCardID INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
ICCID VARCHAR(50) UNIQUE NOT NULL, 
MSISDN BIGINT UNSIGNED UNIQUE); 

INSERT INTO SIMCards (ICCID, MSISDN) VALUES 
(89441000154687982548, 905511528749), 
(89441000154687982549, 905511528744), 
(89441000154687982547, 905511528745); 

私は、次のクエリを実行します。それは返す、というだけで、関連する行を返すよりも、しかし

SELECT SIMCardID FROM SIMCards WHERE ICCID = 89441000154687982549; 

をそれらのすべて。私は引用符でICCIDを囲む場合、それは例えば、正常に動作します:

SELECT SIMCardID FROM SIMCards WHERE ICCID = '89441000154687982549'; 

私は予想通り、なぜ最初のSELECTクエリが動作しませんか?

+1

文字列比較は数値比較とは異なります。一方向またはそれ以外の方法で比較する場合は、値をvarcharまたはintなどのいずれかに型キャストする必要があります。 –

答えて

3

MySQLの整数の最大値(符号なし)は4294967295です。あなたのIDは実質的にその番号よりも大きいです。その結果、データベースから*を整数で選択すると、選択した数値を整数で表すことができないため、動作は未定義になります。

なぜ結果が得られるのかよく分かりませんが、データを整数で表現できない場合は整数で選択しようとしていることは間違いありません。

詳細を追加編集する忘れてしまったこと:MySQLのbigintもIDを表すには十分ではありません。ですから、必ず文字列を使用し、常に使用する必要があります。

関連する問題