【问题标题】:mysql, space equals empty stringmysql,空格等于空字符串
【发布时间】:2016-04-19 08:47:17
【问题描述】:

我只花了 2 个小时来解决我的后端问题。

原因是空字符串等于空格:

SELECT ' ' = '';
-> 1

SELECT STRCMP(' ', '');
-> 0 /* means equal */

有趣的是,

SELECT '' REGEXP '[ ]';
-> 0
SELECT '' REGEXP ' ';
-> 0
SELECT ' ' REGEXP ' ';
-> 1

我可以防止这种情况吗?是设置吗?

【问题讨论】:

    标签: mysql-5.7


    【解决方案1】:

    这里的文档解释了失败的原因http://dev.mysql.com/doc/refman/5.0/en/char.html

    CHAR 和 VARCHAR 列中的值根据排序和比较 分配给列的字符集排序规则。

    所有 MySQL 排序规则都是 PADSPACE 类型。这意味着所有 CHAR, MySQL 中的 VARCHAR 和 TEXT 值进行比较而不考虑任何 尾随空格。本文中的“比较”不包括 LIKE 模式匹配运算符,其尾随空格是 意义重大。

    解决此问题的一种方法是转换为 BINARY

    SELECT BINARY '' = ' ';
    0
    

    你也可以使用LIKE:

    SELECT '' LIKE ' ';
    0
    

    【讨论】:

    • 有趣。但通常''' ' 是占位符,我真的不想在所有查询中使用 LIKE 而不是 =...
    • 但为什么会这样?为什么''和''不是假的。我试过这个 PostgreSQL,它显示正确的输出 False 但不是 MySQL
    • @Code-Monk - 我在回答中添加了解释。
    • 由于某种原因 LIKE 不会破坏我的索引。我想我会在一些特定查询中将其用作临时解决方案...
    • 抱歉这么晚才接受这个答案,我不知道为什么我之前没有这样做
    【解决方案2】:

    不是普通的 MySQL 用户,但我在 MariaDB 10.2.9 上也遇到了这个问题。我通过将VARCHAR 列排序规则从utf8mb4_unicode_ci 更改为utf8mb4_unicode_nopad_ci 解决了这个问题。

    SELECT '' = ' ' COLLATE utf8mb4_unicode_ci;
    结果:1

    SELECT '' = ' ' COLLATE utf8mb4_unicode_nopad_ci;
    结果:0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      • 2013-10-04
      • 2018-05-23
      相关资源
      最近更新 更多