簡體   English   中英

MySQL比較運算符,空格

[英]MySQL comparison operator, spaces

如果數據庫行是這樣的: country = 'usa'並且我查詢"select * from data where country = 'usa '"它也會返回此行。 所以它不完全匹配。

為什么MySQL會這樣做? 而在其他情況下,當它不是真的時,它也將返回TRUE?

手冊所述

所有MySQL排序規則都是PADSPACE類型。 這意味着MySQL中的所有CHARVARCHAR值都會進行比較,而不考慮任何尾隨空格。

LIKE運算符的定義中,它指出:

特別是,尾隨空格很重要,但對於使用=運算符執行的CHARVARCHAR比較則不然:

正如這個答案中提到的:

此行為在SQL-92和SQL:2008中指定。 出於比較的目的,較短的字符串被填充到較長字符串的長度。

從草案(8.2 <比較謂詞>):

如果X的字符長度不等於Y的字符長度,那么為了比較的目的,較短的字符串被有效地替換為已經通過連接擴展到較長字符串的長度的自身的副本。在一個或多個填充字符的右側,其中填充字符是基於CS選擇的。 如果CS具有NO PAD特性,則填充字符是與實現相關的字符,其不同於X和Y的字符集中的任何字符,其整理小於CS下的任何字符串。 否則,填充字符是<space>。

除了其他優秀的解決方案:

 select binary 'a' = 'a ' 

如果列的類型為charvarchar ,則省略尾隨空格; 使用like 'usa '解決問題

嘗試與like或與此一起

country = 'usa ' AND LENGTH(country) = LENGTH('usa ')

如果列的類型為char或varchar,則省略尾隨空格,

可以在以下鏈接上閱讀更多內容:

http://blogs.agilefaqs.com/2011/06/22/trailing-white-spaces-are-ignored-by-mysql-for-comparison-in-a-select-statement/

手冊說:

所有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM