我想检查一列是否有任何值为单个空格字符的值。
我最初以为
WHERE my_column = ' '
会很明智的。但不是。由于某些原因,这还将匹配具有多个空格的列:
SELECT ' ' = ' ' => true
因此,我可以使用正则表达式或十六进制编码进行测试:
WHERE HEX(my_column) = '20' WHERE my_column REGEXP '^\ $'
两者都可以。但是我怀疑两者(肯定是后者)效率都非常低下。
有没有更好的办法?
甲BINARY比较两个串的需要精确匹配
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 '