2012-07-02 45 views
9

顯然非常罕見的問題,但IMO非常惱人的和錯誤的:在MySQL尾隨空格沒有在比較中使用:MySQL的製造空白事

mysql> SELECT "A" = "A "; 
+------------+ 
| "A" = "A " | 
+------------+ 
|   1 | 
+------------+ 
1 row in set (0.00 sec) 

這是在以下情況下尤其有問題:

mysql> SELECT COUNT(*) FROM eq WHERE name != TRIM(name); 
+------------+ 
| COUNT(*) | 
+------------+ 
|   0 | 
+------------+ 
1 row in set (0.00 sec) 

mysql> UPDATE eq SET name=TRIM(name); 
Query OK, 866 row affected (0.01 sec) 
Rows matched: 650907 Changed: 866 Warnings: 0 

有沒有辦法配置MySQL來正確對待空白?

+1

二進制比較將防止去除尾部空格的:'SELECT BINARY '一個'= BINARY 'A';'' –

回答

2

您可以使用LIKE

SELECT "A" LIKE "A "; 

將返回0,但

SELECT "A" LIKE "A"; 

返回1

6

根據the manual,一個快速的解決辦法是使用這樣的:

根據SQL標準,LIKE執行ma tching基於每個字符的基礎上,從而它可以產生從=比較運算符不同的結果:

...

特別地,尾部空格是顯著,這是不與執行CHAR或VARCHAR比較真=運算符...

只要你不使用任何通配符,這應該是相同的=。這個堆棧溢出問題似乎支持假設:Equals(=) vs. LIKE

手冊並沒有說明是否STRCMP()是空白方面比=嚴格,我不能嘗試它現在 - 這可能是值得考慮看看因爲它使它更清晰爲什麼不使用=

由tombom建議的二元比較也是一種選擇,但會產生其他副作用(例如,變音比較嚴格的變音,例如AÄ將會不同),您可能會也可能不想要。關於使用二進制比較的效果的更多信息在this question.

+1

似乎STRCMP'作用相同'='。 「LIKE」也注重大寫字母。謝謝! – Mikhail

+0

@Mikhail啊,所以既不適合你?這很糟糕。然後我猜想二進制比較是去除 –

2

二進制比較是神奇的詞。

Binary Comparison in MySQL Manual

mysql> SELECT 'a' = 'A'; 
     -> 1 
mysql> SELECT BINARY 'a' = 'A'; 
     -> 0 
mysql> SELECT 'a' = 'a '; 
     -> 1 
mysql> SELECT BINARY 'a' = 'a '; 
     -> 0 
+0

+1的唯一方法,但請注意,這也可能會改變其他行爲(如變音比較) –