MySQL比较运算符,空格

use*_*803 9 mysql comparison-operators

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

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

egg*_*yal 10

手册所述:

所有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   '
Run Code Online (Sandbox Code Playgroud)


Max*_*sky 6

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