[英]MySQL comparison operator, spaces
如果數據庫行是這樣的: country = 'usa'
並且我查詢"select * from data where country = 'usa '"
它也會返回此行。 所以它不完全匹配。
為什么MySQL會這樣做? 而在其他情況下,當它不是真的時,它也將返回TRUE?
所有MySQL排序規則都是
PADSPACE
類型。 這意味着MySQL中的所有CHAR
和VARCHAR
值都會進行比較,而不考慮任何尾隨空格。
在LIKE
運算符的定義中,它指出:
正如這個答案中提到的:
此行為在SQL-92和SQL:2008中指定。 出於比較的目的,較短的字符串被填充到較長字符串的長度。
從草案(8.2 <比較謂詞>):
如果X的字符長度不等於Y的字符長度,那么為了比較的目的,較短的字符串被有效地替換為已經通過連接擴展到較長字符串的長度的自身的副本。在一個或多個填充字符的右側,其中填充字符是基於CS選擇的。 如果CS具有NO PAD特性,則填充字符是與實現相關的字符,其不同於X和Y的字符集中的任何字符,其整理小於CS下的任何字符串。 否則,填充字符是<space>。
除了其他優秀的解決方案:
select binary 'a' = 'a '
如果列的類型為char
或varchar
,則省略尾隨空格; 使用like 'usa '
解決問題
嘗試與like
或與此一起
country = 'usa ' AND LENGTH(country) = LENGTH('usa ')
如果列的類型為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 '
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.