MySQL比较运算符,空格

时间:2012-05-08 09:08:04

标签: mysql comparison-operators

如果数据库行是这样的:country = 'usa'并且我查询"select * from data where country = 'usa '"它也会返回此行。所以它不完全匹配。

为什么MySQL会这样做?而在其他情况下,当它不是真的时,它也将返回TRUE?

5 个答案:

答案 0 :(得分:9)

the manual中所述:

  

所有MySQL排序规则都是PADSPACE类型。这意味着MySQL中的所有CHARVARCHAR值都会进行比较,而不考虑任何尾随空格。

LIKE运算符的定义中,它指出:

  

特别是,尾随空格很重要,但对于CHAR运算符执行的VARCHAR=比较则不然:

this answer中所述:

  

此行为在SQL-92和SQL:2008中指定。为了进行比较,较短的字符串被填充到较长字符串的长度。

     

从草案(8.2<比较谓词>):

     
    

如果X的字符长度不等于Y的字符长度,那么为了比较的目的,较短的字符串被有效地替换为已经延长到较长的长度的自身的副本。字符串通过串联在一个或多个填充字符的右侧,其中填充字符是基于CS选择的。如果CS具有NO PAD特性,则填充字符是与实现有关的字符,不同于X和Y字符集中的任何字符,其整理的字符串少于CS下的任何字符串。否则,填充字符是< space>。

  
     

除了其他优秀的解决方案:

select binary 'a' = 'a   '

答案 1 :(得分:4)

如果列的类型为charvarchar,则省略尾随空格;使用like 'usa '解决问题

答案 2 :(得分:1)

使用like或使用此

进行尝试
country = 'usa ' AND LENGTH(country) = LENGTH('usa ')

答案 3 :(得分:0)

如果列的类型为char或varchar,

,则省略尾随空格

可以在以下链接上阅读更多内容:

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

答案 4 :(得分:0)

手册说明了这一点:

  

所有MySQL排序规则都是PADSPACE类型。这意味着所有CHAR   MySQL中的VARCHAR值与VARCHAR值进行比较而不考虑任何值   尾随空格[...]对于所有MySQL版本都是如此,并且不受服务器SQL模式的影响。

http://dev.mysql.com/doc/refman/5.5/en/char.html

如果你需要考虑空白,你基本上必须摆脱语言感知排序。一种简单的方法是强制进行二进制整理。请运行并比较:

SELECT 'ab'='ab ', BINARY 'ab'='ab '