2012-07-02 21 views
9

Offenbar ein sehr seltenes Problem, aber IMO extrem ärgerlich und FALSCH: Nachgestellte Leerzeichen in MySQL ist nicht im Vergleich verwendet:MySQL macht Leerzeichen Materie

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

Dies ist besonders problematisch im folgende Szenario:

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 

Gibt es eine Möglichkeit, MySQL zu konfigurieren, um Whitespace richtig zu behandeln?

+1

Ein Binärvergleich Entfernen von Leerzeichen am Ende verhindern: SELECT BINARY 'a' = BINARY 'a', '' –

Antwort

2

Sie verwenden LIKE

SELECT "A" LIKE "A "; 

0 zurück, aber

SELECT "A" LIKE "A"; 

gibt 1 zurück

6

Nach the manual, eine schnelle Lösung ist LIKE zu verwenden:

Gemäß dem SQL-Standard führt LIKE ma aus Tching auf einer Basis pro-Charakter, es kann also von dem = Vergleichsoperator zu unterschiedlichen Ergebnissen führen:

...

Insbesondere sind Leerzeichen signifikant, was für CHAR oder VARCHAR Vergleiche nicht wahr ist, durchgeführt mit der = operator ...

Solange Sie keine Platzhalter verwenden, sollte dies mit = identisch sein. Diese Stack-Überlauf Frage scheint die Annahme zu unterstützen: Equals(=) vs. LIKE

Das Handbuch gibt nicht an, ob STRCMP() strenger als = in Bezug auf Leerzeichen, und ich kann es jetzt nicht ausprobieren -, die einen Blick wert sein könnten nehmen auch, wie es es klarer macht warum= wird nicht verwendet.

Binärer Vergleich wie von Tombom vorgeschlagen ist auch eine Option, aber werden andere Nebenwirkungen (wie der strengere Vergleich von Umlauten, z. B. A und Ä wird anders sein), die Sie wollen oder nicht wollen. Weitere Informationen zu den Auswirkungen der Verwendung eines binären Vergleichs in this question.

+1

STRCMP' scheint '=' identisch zu handeln. Während "LIKE" auch auf die Großschreibung achtet. Vielen Dank! – Mikhail

+0

@Michail ahh, also funktioniert das auch nicht für dich? Das ist Scheiße. Dann bin ich der Meinung, dass der binäre Vergleich der einzige Weg ist, –

2

Binärvergleich ist das Zauberwort.

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 zu gehen, aber beachte, dass dies auch andere Verhaltensweisen ändern kann (wie der Vergleich von Umlauten). –

Verwandte Themen