如果數據庫行如下所示:country = 'usa'
並且我查詢"select * from data where country = 'usa '"
它也返回此行。所以它不完全匹配。MySQL比較運算符,空格
爲什麼MySQL這樣做?而在其他情況下,如果它不是真的,它也會返回TRUE。
如果數據庫行如下所示:country = 'usa'
並且我查詢"select * from data where country = 'usa '"
它也返回此行。所以它不完全匹配。MySQL比較運算符,空格
爲什麼MySQL這樣做?而在其他情況下,如果它不是真的,它也會返回TRUE。
如果列的類型爲char
或varchar
,則尾部空格被忽略;使用like 'usa '
解決問題
嘗試與like
或與此
country = 'usa ' AND LENGTH(country) = LENGTH('usa ')
正如the manual提到:
所有MySQL校對規則
PADSPACE
類型。這意味着比較MySQL中的所有CHAR
和VARCHAR
值,而不考慮任何尾隨空格。
在LIKE
操作者的定義,它指出:
如this answer所述:
此行爲在SQL-92和SQL:2008中指定。爲了比較,較短的字符串被填充到較長字符串的長度。
從草案(8.2 <比較謂詞>):
如果在X的字符的長度不等於Y中的字符的長度,則較短的字符串被有效地替換,對於目的通過一個或多個填充字符右側的連接將其自身的副本擴展到較長字符串的長度,其中基於CS選擇填充字符。如果CS具有NO PAD特性,則填充字符是一個與實現無關的字符,它與X和Y字符集中的任何字符不同,它們比CS中的任何字符串都少。否則,填充字符是<空間>。
除了其它優秀的解決方案:
select binary 'a' = 'a '
非常好的答案 –
@eggyal,那麼**修正**是什麼? – Pacerier
的尾部空格如果列類型是CHAR或VARCHAR被省略,
可以瞭解更多關於其下面的鏈接上:
說明書上說:
所有MySQL歸類都是PADSPACE類型。這意味着MySQL中的所有CHAR 和VARCHAR值都將進行比較,而不考慮任何 尾隨空格[...]對於所有MySQL版本都是如此,並且不受服務器SQL模式的影響。
http://dev.mysql.com/doc/refman/5.5/en/char.html
如果您需要考慮的空白,你基本上已經擺脫語言感知排序。一個簡單的方法是強制二進制排序。請運行並比較:
SELECT 'ab'='ab ', BINARY 'ab'='ab '
超級迂迴觀察:這裏的'BINARY'運算符不是「強制執行二進制排序」,這可以通過應用COLLATE * _bin子句來完成,而是將其非二進制操作數強制轉換爲二進制字符串 - 所以這樣做的是比較正好是逐字節的,這與二進制排序會做什麼相似(除了二進制排序仍然是PADSPACE)。讀者可能會發現瞭解這種差異很有用,在手冊部分[The _bin and binary Collations](https://dev.mysql.com/doc/en/charset-binary-collations.html)中有更詳細的解釋。 。 – eggyal
謝謝,這些澄清永遠不合適。我甚至不會放棄,我實際上有「二進制比較」的想法,但錯誤打印它 - 我經常這樣做:) –
+1,http://dev.mysql.com/doc/refman/5.0/en/char.html,當檢索到CHAR值時,將刪除尾隨空格。 –