2013-11-21 82 views
0

在我的繼承的數據庫中,有時二進制問題被編碼爲('是','否'),有時也被編碼爲(1,0)。我錯誤地在數字編碼的字段上查詢字符串'是'。我的猜測是這個字符串被MySQL變成了'0'。MySQL整數字段匹配字符串是怎麼回事?

我有這樣的查詢:

SELECT `children_under_18` 
    FROM `households` 
WHERE `children_under_18` = 'Yes' 
GROUP BY `children_under_18` 

它結束了僅匹配記錄,其中children_under_18是0,我想做什麼相反。我知道我需要更加小心。我正在尋找關於發生了什麼的明確答案。比較時

+2

「children_under_18」的類型是什麼 –

+0

Jorge:children_under_18是一個int類型。通常數據庫設計者選擇將這種類型的值編碼爲enum('Yes','No')。我忘了這個字段的編碼是什麼,這是我如何獲得不想要的結果。 –

回答

1

字符串將被轉換成0到數字(包含數字+字符串當然字符串轉換爲數字。但這不是好的做法)。如果你想存儲二進制值(是/否

mysql> SELECT 'Yes' + 0; 
+-----------+ 
| 'Yes' + 0 | 
+-----------+ 
|   0 | 
+-----------+ 
1 row in set, 1 warning (0.00 sec) 

mysql> show warnings; 
+---------+------+-----------------------------------------+ 
| Level | Code | Message         | 
+---------+------+-----------------------------------------+ 
| Warning | 1292 | Truncated incorrect DOUBLE value: 'Yes' | 
+---------+------+-----------------------------------------+ 

或True/False)或小值設置,ENUM是不錯的選擇。 它需要很小的磁盤空間,並且可以使用有意義的字符串。

mysql> CREATE TABLE enum_test(a ENUM('Yes', 'No')); 
Query OK, 0 rows affected (0.00 sec) 

mysql> insert into enum_test values('Yes'), ('No'), ('Invalid'); 
Query OK, 3 rows affected, 1 warning (0.00 sec) 
Records: 3 Duplicates: 0 Warnings: 1 

mysql> show warnings; 
+---------+------+----------------------------------------+ 
| Level | Code | Message        | 
+---------+------+----------------------------------------+ 
| Warning | 1265 | Data truncated for column 'a' at row 3 | 
+---------+------+----------------------------------------+ 
1 row in set (0.00 sec) 

mysql> select * from enum_test where a = 'Yes'; 
+------+ 
| a | 
+------+ 
| Yes | 
+------+ 
1 row in set (0.00 sec) 

mysql> select * from enum_test where a = 'No'; 
+------+ 
| a | 
+------+ 
| No | 
+------+ 
1 row in set (0.00 sec) 
+0

對於一個簡單的布爾值,有爭議的是'ENUM' *可能是合適的(儘管如上所示將無效值截斷爲特殊的空字符串值''',除了明確的NULL值,可能會有其他建議)。但是,仍然應該閱讀Chris Komlenic的文章[爲什麼MySQL的ENUM數據類型是邪惡的8個原因](http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/ ),然後將其部署到生產系統中。 – eggyal

+0

@eggyal偉大的職位是!實際上我沒有使用'ENUM'我只是懶惰,但是在將來永遠不會使用它,即使是勤奮。 –