2016-01-14 3 views
7

Просто у меня было 2 часа, чтобы устранить проблему на моем сервере.mysql, space равно пустой строке

Причина в том, что пустой строки равна площади:

SELECT ' ' = ''; 
-> 1 

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

Интересно, что

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

Могу ли я предотвратить это? Это настройка?

ответ

4

Причина этого не удается объясняется в документации здесь http://dev.mysql.com/doc/refman/5.0/en/char.html:

Значения в CHAR и VARCHAR столбцы сортируются и сравниваются по к алфавитов сортировки, назначенного на колонке.

Все сопоставления MySQL имеют тип PADSPACE. Это означает, что все значения CHAR, VARCHAR и TEXT в MySQL сравниваются без учета любых конечных пробелов . «Сравнение» в этом контексте не включает в себя оператор соответствия шаблону LIKE, для которого конечные пробелы имеют значение .

Один из способов обойти это будет брошено как BINARY

SELECT BINARY '' = ' '; 
0 

Вы также можете использовать LIKE:

SELECT '' LIKE ' '; 
0 
+0

интересное. Но обычно '' '' и '' '' являются заполнителями, я действительно не хочу использовать LIKE вместо = во всех моих запросах ... – Sebas

+0

Почему это происходит? Почему «и» не является ложным. Я пробовал этот PostgreSQL и показывает корректный вывод 'False', но не MySQL –

+0

@ Code-Monk - я добавил объяснение в ответ. – billynoah

 Смежные вопросы

  • Нет связанных вопросов^_^