2013-07-06 57 views
2

有一個簡單的MySQL查詢有趣的問題。我正在嘗試在id字段中進行完全匹配。MySQL完全匹配的行爲像LIKE

SELECT id 
FROM tablename 
WHERE id = '23' 

返回

id: 23 

一切都很好,直到我做的:

SELECT id 
FROM repairs 
WHERE id = '23abcd' 

返回

id: 23 

爲什麼地球上會做到這一點? id字段爲int(10),數據庫爲MyISAM utf8_general_ci。

有什麼想法?

+0

切換到utf8_latin1_ci – mirkobrankovic

+0

這是MySQL的方式。而不是拒絕一個明顯不正確的陳述(因爲將數字與'23abcd'進行比較是沒有意義的),MySQL選擇返回「某些東西」。大多數其他數據庫管理系統只會拋出一個錯誤 –

回答

3

你的數據庫有int字段,它會截斷字符,只考慮數字,這就是爲什麼你得到23作爲返回ID。

0

您在查詢中引用了數字,因此MySQL必須將其從字符串轉換爲數字。當它這樣做時,它只使用字符串的數字部分。

我不認爲這種行爲是完全合適的(「23abcd」.ToInt()應該是NULL,我認爲),但這就是它的作用。

+0

該查詢應該簡單地被拒絕(並且大多數DBMS會這樣做) –

0

由於Fakhruddin說int字段截斷字符的值。那就對了。但是你可以通過設置STRICT_ALL_TABLES模式

mysql> SET sql_mode = 'STRICT_ALL_TABLES'; 

一件事是,你需要存儲的ID作爲字符串(VARCHAR),如果他們包含字母防止被插入在第一時間錯誤的價值觀。