2011-09-28 17 views
2

有人能告訴我這個的技術原因嗎?爲什麼3行刪除sql查詢拼圖?

CREATE TABLE test (
    id varchar(3) NOT NULL, 
    PRIMARY KEY (id) 
); 

INSERT INTO test VALUES ('0'), ('1'), ('2'), ('ab'), ('bb'); 

select * from test; 

DELETE FROM test WHERE id=0; 

Which Deletes 3 rows from table test. 
+0

哪3行被刪除? – Mark

回答

6

正因爲如此:

SELECT 0 = 'ab'; 
+----------+ 
| 0 = 'ab' | 
+----------+ 
|  1 | 
+----------+ 

要刪除確切行使用二進制運算符,這將迫使逐字節的比較 - 當你比較的數字爲字符串

DELETE FROM test WHERE id = BINARY 0; 
+0

閱讀關於mysql排序規則 - http://dev.mysql.com/doc/refman/5.1/en/charset-collat​​ions.html – Devart

5

,他們相比作爲浮點數。任何不以數字開頭的字符串都會隱式轉換爲數字0.

+0

Ouch。我會稱這是一個MySQL錯誤。其他RDBMS如何處理? – Thilo

+0

這是一種行爲。 – Devart

0

字符'0'與整數0之間存在差異。當您將字符與整數比較時,字符串如果不是整數,則返回假的值(i,e)A 0因此使條件成立並刪除第一行,第四行和第五行從你的表中刪除你需要檢查的特定行...

刪除來自測試,其中id ='0'; (字符0不是整數0)

0

嘗試改爲比較相同類型的值,例如

DELETE FROM test WHERE id = CAST(0 AS VARCHAR(3)); 
0

好了第一個我困惑,當我看到這一點,但現在我得到它 當你運行

select * from test; 

DELETE FROM test WHERE id=0; 

這個查詢比較每行作爲一個整數字符串, 所以,當MySQL帶有以AB & BB因此MySQL把它當作一個0,並刪除它 如果你與像1AB因此MySQL以1AB爲1,當你火查詢刪除1而不是0,將刪除1AB任何數字開始它

嘗試

select * from test; 

DELETE FROM test WHERE id='0'; 

本準則比較行作爲一個字符串,所以當他得到確切的「0」的MySQL刪除它別的什麼都沒有。