SELECT仅空字符串返回带空格的结果

时间:2016-09-19 11:33:00

标签: mysql sql

此SQL查询:

select c1 from table where c1='';

返回MySQL中具有c1=' '(一个空格)的行。

这是故意还是错误?

编辑:请检查SQL Fiddle链接hereSELECT查询中的空格数无关紧要。

6 个答案:

答案 0 :(得分:4)

这是记录在案的行为。

LIKE提到的MySQL文档

  

尾随空格很重要,不适用于CHAR或   使用=运算符执行VARCHAR比较:

SQL Server works the same way.

答案 1 :(得分:3)

如果您的列来自类型 CHAR 而不是VARCHAR,那么这是正确的。 在CHAR-Fields上将跟踪比较忽略的空白! 所以

field = ''
field = '    '

是一样的。

答案 2 :(得分:3)

这些都在文档中说明。我在这里引用了重点。但我建议通过完整的documentation

  

VARCHAR值在存储时不会填充。尾随空间   在存储和检索值时保留,符合   标准SQL。

     

另一方面,CHAR值在存储时会被填充但是   检索时会忽略尾随空格。

enter image description here

  

所有MySQL排序规则都是PADSPACE类型。这意味着所有CHAR,   MySQL中的VARCHAR和TEXT值进行了比较而不考虑任何问题   尾随空格。在这种情况下,“比较”不包括   LIKE模式匹配运算符,尾随空格   显著。

说明: Trailing spaces在使用比较运算符('=')比较字符串时被忽略。但尾随空格对LIKEpattern 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)

如果c1CHAR(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 ;