2014-03-04 77 views
1

爲什麼這個查詢:MySQL的空間comparsion地獄

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 /文本比較LIKE)?

不幸的是我使用的是專有框架,我不能強迫它總是在查詢中使用LIKE來進行文本比較或修剪所有輸入。

回答

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 | 
+--------+----+ 

參考

+0

設置'binary'排序規則解決了我的問題,謝謝! :) – Bobby

0

如果列的類型爲char或varchar,則尾隨空格將被忽略。請參閱documentation中的討論。

+1

@Downvoter:爲什麼?這是一個已知的事實。 –

+0

@Downvoter:這個答案是OP問題的最佳點 – TechGuy

+0

@TechGuy:感謝您分享有用的鏈接 – Nishant

0

所有MySQL校對規則類型PADSPACE的。這意味着MySQL中的所有CHAR,VARCHAR和TEXT值都會進行比較,而不考慮任何尾隨空格。在此上下文中的「比較」不包括LIKE模式匹配運算符,其尾部空格是重要的。

+0

感謝@TechGuy分享這樣一個有用的鏈接https://dev.mysql.com/doc/refman/5。0/A/char.html – Nishant