7

我想检查一列是否有任何值是单个空格字符。

我一开始以为

WHERE my_column = ' '

会是明智的。但不是。由于某种原因,这也将匹配具有多个空格的列:

SELECT '    ' = ' '           => true

所以我可以使用正则表达式或十六进制编码来测试:

WHERE HEX(my_column) = '20'
WHERE my_column REGEXP '^\ $'

两者都有效。但我怀疑两者(当然是后者)效率很低。

有没有更好的办法?

4

3 回答 3

11

完全匹配需要比较BINARY两个字符串

在正常情况下,比较中不考虑尾随空格,但BINARY运算符强制它为:

BINARY 还会导致尾随空格很重要。

mysql> SELECT BINARY '   ' = ' ';
+--------------------+
| BINARY '   ' = ' ' |
+--------------------+
|                  0 |
+--------------------+

顺便说一句,受尾随空格问题影响的不仅仅是空格比较:

mysql> SELECT 'abc   ' = 'abc';
+------------------+
| 'abc   ' = 'abc' |
+------------------+
|                1 |
+------------------+

...但...

mysql> SELECT BINARY 'abc   ' = 'abc';
+-------------------------+
| BINARY 'abc   ' = 'abc' |
+-------------------------+
|                       0 |
+-------------------------+

...更令人困惑的是,前导空格重要:

mysql> SELECT ' abc   ' = 'abc';
+-------------------+
| ' abc   ' = 'abc' |
+-------------------+
|                 0 |
+-------------------+

关于索引:

BINARY将阻止在字符列上使用索引。但是,文档上的注释表明,如果将运算符应用于比较的字符串文字端,则将使用索引,如下所示:BINARY

SELECT * FROM `tbl` WHERE `col` = BINARY 'string   '
于 2012-11-08T14:41:33.433 回答
3
where my_column = ' ' and LENGTH(my_column) = 1
于 2012-11-08T14:39:21.203 回答
0

SELECT CASE WHEN COL_NAME=' ' THEN 'yes' ELSE 'no' END AS SPACE_INDICATOR FROM Table_NAME WHERE LENGTH(COL_NAME)=1;

于 2012-11-08T14:44:45.463 回答