MySQL空间比较地狱
为什么要这样问:MySQL空间比较地狱,mysql,Mysql,为什么要这样问: SELECT "hello" = " hello", "hello" = "hello ", "hello" <> "hello ", "hello" LIKE "hello ", "hello" LIKE "hello%" 选择 “你好”=“你好”, “你好”=“你好”, “你好”“你好”, “你好”就像“你好”, “你好”就像“你好%” 将这些结果返回给我: "hello" = " hello" -&
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”->0
“你好”=“你好”->1
“你好”“你好”->0
“你好”类似于“你好”->0
“你好”就像“你好%”->1
特别是,我期望“hello”=“hello”
为假,“hello”“hello”
为真(在本例中,类似于的行为完全符合我的要求)
为什么MySQL会以如此随意和不一致的方式比较空间?(例如在“hello”=“hello”
上返回0,在“hello”=“hello”
上返回1)
是否有任何方法可以将MySQL配置为始终在“严格模式”下工作(换句话说,使其始终像varchar/text比较的那样工作)
遗憾的是,我使用的是一个专有框架,我无法强制它在查询文本比较或修剪所有输入时始终使用之类的。如果列的类型为char或varchar,则尾部空格将被忽略。请参阅中的讨论。
“hello”=“hello”--0
,
因为这不是一个精确的匹配
“hello”=“hello”--1
,
因为varchar类型忽略了尾随空格
“你好”“你好”--0
,
因为varchar类型忽略了尾随空格
“你好”类似于“你好”--0
,
因为varchar类型的尾随空格被忽略,而LIKE
会根据每个字符执行匹配
“你好”就像“你好%”--1
,
因为这是一个部分模式匹配
如果需要严格检查,可以对要比较的值使用binary
mysql> select binary('hello')=binary('hello ') bin_eq, 'hello'='hello ' eq;
+--------+----+
| bin_eq | eq |
+--------+----+
| 0 | 1 |
+--------+----+
请参阅:
所有MySQL排序规则都是PADSPACE类型。这意味着MySQL中的所有CHAR、VARCHAR和TEXT值都会进行比较,而不考虑任何尾随空格。此上下文中的“比较”不包括LIKE模式匹配运算符,因为尾随空格非常重要。@Downvoter:这是OP的最佳答案problem@TechGuy:感谢分享有用的链接感谢@TechGuy分享如此有用的链接