2016-01-14 13 views
7

Zajęło mi 2 godziny, aby rozwiązać problem na moim backend.mysql, spacja równa się pustemu ciągowi

Bo było to, że pusty ciąg znaków jest równa przestrzeni:

SELECT ' ' = ''; 
-> 1 

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

Co ciekawe,

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

można temu zapobiec? Czy to ustawienie?

Odpowiedz

4

Powodem tego nie jest wyjaśnione w docs tutaj http://dev.mysql.com/doc/refman/5.0/en/char.html:

Wartości w CHAR i VARCHAR kolumn są klasyfikowane według iw porównaniu do zestawu znaków przypisany do sortowania kolumny.

Wszystkie sortowania MySQL są typu PADSPACE. Oznacza to, że wszystkie wartości CHAR, VARCHAR i TEXT w MySQL są porównywane bez względu na końcowe spacje z . "Porównanie" w tym kontekście nie obejmuje operatora dopasowywania wzorca LIKE, dla którego spacje końcowe są znaczące.

Jednym ze sposobów obejścia tego problemu byłoby rzucić jak BINARY

SELECT BINARY '' = ' '; 
0 

Można również użyć LIKE:

SELECT '' LIKE ' '; 
0 
+0

ciekawego. Ale zwykle '' '' i '' '' są symbolami zastępczymi, naprawdę nie chcę używać LIKE zamiast = we wszystkich moich pytaniach ... – Sebas

+0

Bu dlaczego tak się dzieje? Dlaczego "i" "nie jest fałszywe. Próbowałem tego PostgreSQL i pokazuje poprawne wyjście 'False' ale nie MySQL –

+0

@ Code-Monk - dodałem wyjaśnienie w odpowiedzi. – billynoah