2016-01-14 14 views
7

Mi ci sono voluti 2 ore per risolvere un problema sul mio back-end.mysql, lo spazio è uguale alla stringa vuota

Causa è stata quella di stringa vuota a parità di spazio:

SELECT ' ' = ''; 
-> 1 

SELECT STRCMP(' ', ''); 
-> 0 /* means equal */ 

Abbastanza interessante,

SELECT '' REGEXP '[ ]'; 
-> 0 
SELECT '' REGEXP ' '; 
-> 0 
SELECT ' ' REGEXP ' '; 
-> 1 

Posso evitare questo? È un ambiente?

risposta

4

La ragione ciò non riesce è spiegato nei documenti qui http://dev.mysql.com/doc/refman/5.0/en/char.html:

valori in CHAR e VARCHAR colonne sono allineati e confrontati secondo la collazione set di caratteri assegnato alla colonna.

Tutte le regole di confronto MySQL sono di tipo PADSPACE. Ciò significa che tutti i valori CHAR, VARCHAR e TEXT in MySQL vengono confrontati indipendentemente dagli spazi finali . "Confronto" in questo contesto non include l'operatore di corrispondenza modello LIKE , per il quale gli spazi finali sono significativi .

Un modo per ovviare a questo sarebbe quella di lanciare come BINARY

SELECT BINARY '' = ' '; 
0 

È inoltre possibile utilizzare LIKE:

SELECT '' LIKE ' '; 
0 
+0

interessante. Ma normalmente '''' e ''' 'sono segnaposti, non voglio usare LIKE invece di = in tutte le mie query ... – Sebas

+0

Bu perché sta succedendo? Perché "" e "" non sono falsi. Ho provato questo PostgreSQL e sta mostrando l'output corretto 'False' ma non MySQL –

+0

@ Code-Monk - Ho aggiunto una spiegazione nella risposta. – billynoah

Problemi correlati