0

MySQL 语句

mysql> select * from field where dflt=' '

似乎匹配空值;和声明不同

mysql> select * from field where concat('_',dflt,'_') = '_ _';

我在 MySQL 参考中找不到此行为的描述。如何让 MySQL 从字面上解释输入?

编辑:这确实不会匹配 NULL 值,但它确实匹配空值。

4

2 回答 2

2

The CHARand VARCHARTypes中所述:

所有 MySQL 排序规则都是 type 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   '
于 2012-08-27T00:40:11.597 回答
1

我找不到任何文档,但众所周知,在进行文本比较时会忽略尾随空格。

要强制进行文字匹配,请尝试以下操作:

select *
from field
where dflt = ' '
and length(dflt) = 1; // length does not ignore trailing spaces
于 2012-08-27T00:40:01.610 回答