此SQL查询:
select c1 from table where c1='';
返回MySQL中具有c1=' '
(一个空格)的行。
这是故意还是错误?
编辑:请检查SQL Fiddle链接here,SELECT
查询中的空格数无关紧要。
答案 0 :(得分:4)
答案 1 :(得分:3)
如果您的列来自类型 CHAR 而不是VARCHAR,那么这是正确的。 在CHAR-Fields上将跟踪比较忽略的空白! 所以
field = ''
field = ' '
是一样的。
答案 2 :(得分:3)
这些都在文档中说明。我在这里引用了重点。但我建议通过完整的documentation
VARCHAR值在存储时不会填充。尾随空间 在存储和检索值时保留,符合 标准SQL。
另一方面,CHAR值在存储时会被填充但是 检索时会忽略尾随空格。
所有MySQL排序规则都是PADSPACE类型。这意味着所有CHAR, MySQL中的VARCHAR和TEXT值进行了比较而不考虑任何问题 尾随空格。在这种情况下,“比较”不包括 LIKE模式匹配运算符,尾随空格 显著。
说明: Trailing spaces
在使用比较运算符('=')比较字符串时被忽略。但尾随空格对LIKE
(pattern matching operator
)
答案 3 :(得分:2)
此行为符合ANSI SQL-92标准。符合此标准的任何数据库都将表现出相同的行为。引用:
notificationWin = new_notification;
因此,根据这些规范,3) The comparison of two character strings is determined as fol-
lows:
a) If the length in characters of X is not equal to the length
in characters of Y, then the shorter string is effectively
replaced, for the purposes of comparison, with a copy of
itself that has been extended to the length of the longer
string by concatenation on the right of one or more pad char-
acters, where the pad character is chosen based on CS. If
CS has the NO PAD attribute, then the pad character is an
implementation-dependent character different from any char-
acter in the character set of X and Y that collates less
than any string under CS. Otherwise, the pad character is a
<space>.
b) The result of the comparison of X and Y is given by the col-
lating sequence CS.
和'abc' = 'abc '
评估为true(但'' = ' '
为false)。
答案 4 :(得分:1)
如果c1
为CHAR(1)
,那么这是正确的,因为CHAR
列固定宽度,如有必要,将填充空白。
因此即使您将''
放入CHAR(1)
字段,您也会在' '
时获得SELECT
。此外,过滤空字符串将产生' '
。
请接受Martin Smith的回答,因为他在我面前给出了正确的提示。
<击>
此外,根据MySQL documentation,在将字符串与=
进行比较时会忽略尾随空格,因此,如果您的c1
列仅包含空格(或者您的情况中只有一个),则即使您过滤WHERE c1 = ''
:
特别是,尾随空格很重要,对于使用=运算符执行的CHAR或VARCHAR比较不适用
mysql> SELECT 'a' = 'a ', 'a' LIKE 'a ';
+------------+---------------+
| 'a' = 'a ' | 'a' LIKE 'a ' |
+------------+---------------+
| 1 | 0 |
+------------+---------------+
1 row in set (0.00 sec)
击> <击> 撞击>
答案 5 :(得分:-3)
试试这个 -
Select case when c1 = '' then ' ' else c1 end from table ;