Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL空间比较地狱_Mysql - Fatal编程技术网

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分享如此有用的链接