为什么这个查询:
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
进行文本比较或修剪所有输入。
答案 0 :(得分:0)
如果列的类型为char或varchar,则省略尾随空格。请参阅documentation中的讨论。
答案 1 :(得分:0)
"hello" = " hello" -- 0
,"hello" = "hello " -- 1
,"hello" <> "hello " -- 0
,"hello" LIKE "hello " -- 0
,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模式匹配运算符,尾随空格很重要。