2017-09-27 114 views
0

我的表看起來像這樣:WHERE A或B IN(x)的不匹配,但返回的行

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

出於某種原因,得到返回的行,當我打電話:

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

爲什麼會發生?

隨意重新創建與複製粘貼您的分貝:

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")評估爲真。更具體地說,ts_9具有整數0的值。根據documentation

如果所有的值是常數,它們是根據

換句話說,"asdewdwedewd"將被視爲一個int expr的 型評價。當mysql將它轉換爲int cast("asdewdwedewd" as signed integer)時,我們得到0。因此0 in (0)評估爲真。

0

優化帶來的數據類型相同。 將字符串翻譯爲十進制時,我們得到零。 有必要預先定義或轉換數據類型。

+0

字符串到小數不總是產生0;例如,將「1.5676asdafnenawuiawuin」和「1asdkjaklfkl」投射到DECIMAL(5,2)的結果分別爲1.57和1.00。 – Uueerdo

相關問題