2017-09-27 4 views
0

を返します。が、私のテーブルはこのようになります行

| a | ts_9 | ts_11 | 
|----|------|-------| 
| yx | 0 |  | 
| xy | 0 |  | 

そして、私が呼び出したときに行が返されます何らかの理由:

SELECT * FROM things WHERE ts_9 IN ("asdewdwedewd") OR ts_11 IN ("asdewdwedewd") 

なぜそれが起こるのですか?

コピーペーストを使用してDBにそれを再作成してお気軽に:

CREATE TABLE `things` (
    `a` char(12) NOT NULL DEFAULT '', 
    `ts_9` decimal(2,0) NOT NULL, 
    `ts_11` char(1) NOT NULL DEFAULT '', 
    PRIMARY KEY (`a`), 
    UNIQUE KEY `a` (`a`)); 

INSERT INTO `things` (`a`, `ts_9`, `ts_11`) VALUES ('yx', '0', ''), ('xy', '0', ''); 
+3

私の推測では、文字列は整数にキャストされています。 – Uueerdo

+0

@Uueerdo素晴らしい推測、ありがとう!これを避けるための一般的な予防策はありますか? – Basti

+0

私は、文字列が正しく解析されない限り、数値と文字列の型を等式を含む式に混ぜてはいけません。 – Uueerdo

答えて

3

ts_9 IN ("asdewdwedewd")がtrueと評価されているため。より具体的には、ts_9の値は整数0です。すべての値が定数である場合documentation

によれば、それらは、換言すれば、式expr

の種類 によれば、"asdewdwedewd"はintとして扱われる評価されます。 mysqlがintをcast("asdewdwedewd" as signed integer)に変換すると、0となります。したがって、0 in (0)はtrueと評価されます。

0

オプティマイザは、同じタイプのデータをもたらします。 文字列を10進数に変換するとき、ゼロになります。 データ型を事前定義または変換する必要があります。

+0

小数点以下桁数は常に0を返すわけではありません。たとえば、 "1.5676asdafnenawuiawuin"と "1asdkjaklfkl"をDECIMAL(5,2)にキャスティングすると、それぞれ1.57と1.00になります。 – Uueerdo

関連する問題