MySQL空间比较地狱

时间:2014-03-04 09:35:30

标签: mysql

为什么这个查询:

SELECT 
    "hello" = " hello",
    "hello" = "hello ",
    "hello" <> "hello ",
    "hello" LIKE "hello ",
    "hello" LIKE "hello%"

将这些结果归还给我:

"hello" = " hello"         -> 0
"hello" = "hello "         -> 1
"hello" <> "hello "        -> 0
"hello" LIKE "hello "      -> 0
"hello" LIKE "hello%"      -> 1

特别是,我希望"hello" = "hello "false"hello" <> "hello "true(在这种情况下为LIKE,行为完全符合我的要求)。

为什么MySQL以这种任意和不一致的方式比较空间? (例如在"hello" = " hello"上返回0,在"hello" = "hello "上返回1)。

有没有办法让MySQL在“严格模式”下始终工作(换句话说,为了使varchar / text comparsion的行为总是像LIKE那样)?

可悲的是,我正在使用专有框架,我不能强迫它始终在查询中使用LIKE进行文本比较或修剪所有输入。

3 个答案:

答案 0 :(得分:0)

如果列的类型为char或varchar,则省略尾随空格。请参阅documentation中的讨论。

答案 1 :(得分:0)

  • "hello" = " hello" -- 0
       因为它不是完全匹配
  • "hello" = "hello " -- 1
       因为varchar类型忽略尾随空格
  • "hello" <> "hello " -- 0
       因为varchar类型忽略尾随空格
  • "hello" LIKE "hello " -- 0
       因为varchar类型会忽略尾随空格,LIKE会基于每个字符执行匹配
  • "hello" LIKE "hello%" -- 1
       因为它是部分模式匹配

如果您想要严格检查,可以对要比较的值使用binary

mysql> select binary('hello')=binary('hello ') bin_eq, 'hello'='hello ' eq;
+--------+----+
| bin_eq | eq |
+--------+----+
|      0 |  1 |
+--------+----+

请参阅

答案 2 :(得分:0)

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