2012-07-02 14 views
9

A quanto pare una questione molto rara, ma IMO estremamente fastidioso e SBAGLIATO: Trailing spazi in MySQL non vengono utilizzati in confronto:MySQL rendendo importa spazi

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

Ciò è particolarmente problematica nel seguente scenario:

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 

C'è un modo per configurare MySQL per trattare correttamente gli spazi?

+1

Un confronto binario impedisce la rimozione di spazi finali: 'SELEZIONARE BINARIO 'un' = BINARIO 'a';' ' –

risposta

2

Si può usare COME

SELECT "A" LIKE "A "; 

tornerà 0 ma

SELECT "A" LIKE "A"; 

restituisce 1

6

Secondo the manual, una soluzione rapida è quella di utilizzare LIKE:

Per lo standard SQL, LIKE esegue ma Tching su una base per-caratteri, quindi può produrre risultati diversi dall'operatore = confronto:

...

In particolare, spazi finali sono significativi, che non è vero per CHAR o VARCHAR confronti eseguiti con the = operator ...

finché non si utilizza alcun carattere jolly, questo deve essere identico a =. Questa domanda Stack Overflow sembra sostenere l'ipotesi: Equals(=) vs. LIKE

Il manuale non precisa se STRCMP() è più rigorosa di = in termini di spazi, e non posso provarlo in questo momento - che potrebbe essere la pena dare un'occhiata allo stesso modo, in quanto rende più chiaro lo perché non viene utilizzato=.

Il confronto binario come suggerito da tombom è anche un'opzione, ma avrà altri effetti collaterali (come il confronto più rigoroso di Umlauts, ad esempio A e Ä sarà diverso) che si può o non si desidera. Maggiori informazioni sugli effetti dell'uso di un confronto binario in this question.

+1

STRCMP' sembra agire identico a' = '. Mentre 'LIKE' presta attenzione anche alla maiuscola. Grazie! – Mikhail

+0

@Mikhail ahh, quindi non funziona per te? Questo fa schifo. Quindi suppongo che il confronto binario sia l'unico modo per andare a –

2

Il paragone binario è la parola magica.

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, ma nota che questo potrebbe cambiare anche altri comportamenti (come il confronto di Umlauts) –