【问题标题】:How to string-compare for a single space如何对单个空格进行字符串比较
【发布时间】:2014-09-20 08:06:03
【问题描述】:

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

我一开始也这么认为

WHERE my_column = ' '

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

SELECT '    ' = ' '           => true

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

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

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

有没有更好的办法?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    两个字符串中的BINARY comparison 是完全匹配所必需的

    一般情况下,比较中不考虑尾随空格,但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 将阻止在字符列上使用索引。但是,a note on the docs 建议如果将 BINARY 运算符应用于比较的字符串文字侧,则使用索引 ,如下所示:

    SELECT * FROM `tbl` WHERE `col` = BINARY 'string   '
    

    【讨论】:

    • 使用BINARY 是否仍然使用索引?
    • 我想知道为什么他们也不忽略尾随的“G”字符?或尾随'3',或'6',或'x'......
    【解决方案2】:
    where my_column = ' ' and LENGTH(my_column) = 1
    

    【讨论】:

    • 它在 mysql 中的 LENGTH 不是 len
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      相关资源
      最近更新 更多