一尘不染

如何对单个空格进行字符串比较

mysql

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

我最初以为

WHERE my_column = ' '

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

SELECT '    ' = ' '           => true

因此,我可以使用正则表达式或十六进制编码进行测试:

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

两者都可以。但是我怀疑两者(肯定是后者)效率都非常低下。

有没有更好的办法?


阅读 546

收藏
2020-05-17

共1个答案

一尘不染

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   '
2020-05-17