2012-05-08 3 views
8

Если строка базы данных выглядит так: country = 'usa' и i query "select * from data where country = 'usa '", она также возвращает эту строку. Так что это не точное совпадение.Оператор сравнения MySQL, пробелы

Почему MySQL это делает? И в каких других случаях он также вернет TRUE, если это не так?

ответ

4

Промежуточные пробелы опущены, если столбец имеет тип char или varchar; с помощью like 'usa ' решает проблему

+0

+1, http://dev.mysql.com/doc/refman/5.0/en/char.html, когда значения CHAR извлекаются завершающие пробелы удаляются. –

0

попробовать с like или с этим

country = 'usa ' AND LENGTH(country) = LENGTH('usa ') 
9

Как уже упоминалось в the manual:

Все MySQL сортировки имеют тип PADSPACE. Это означает, что все значения CHAR и VARCHAR в MySQL сравниваются без учета каких-либо конечных пробелов.

В определении оператора LIKE, он утверждает:

В частности, концевые пробелы являются значительными, что не верно для CHAR или VARCHAR сравнений, выполненных с оператором =:

Как указано в this answer:

Это поведение указано в SQL-92 и SQL: 2008. Для целей сравнения более короткая строка дополняется длиной более длинной строки.

Из проекта (8,2 < сравнение сказуемое >):

Если длина в символах X не равен длине в знаках Y, то короче струна эффективно заменить, для целей сравнения с самой копией, которая была расширена до длины более длинной строки путем конкатенации справа от одного или нескольких символов пэда, где символ пэда выбирается на основе CS. Если CS имеет характеристику NO PAD, тогда символ прокладки является зависимым от реализации символом, отличным от любого символа в наборе символов X и Y, который сравнивается с любой строкой под CS. В противном случае символ прокладки будет < пробел >.

В дополнение к другим отличным решениям:

select binary 'a' = 'a ' 
+0

Очень хороший ответ –

+0

@eggyal, Так что же такое ** исправить **? – Pacerier

0

В руководстве указано следующее:

Все сопоставления MySQL имеют тип PADSPACE. Это означает, что все значения CHAR и VARCHAR в MySQL сравниваются независимо от любых конечных пробелов [...] Это справедливо для всех версий MySQL и не зависит от режима SQL-сервера.

http://dev.mysql.com/doc/refman/5.5/en/char.html

Если вам необходимо рассмотреть пустое пространство, вы в основном должны избавиться от языка знает сортировки. Простым способом является принудительная двоичная сортировка. Пожалуйста, запустите и сравните:

SELECT 'ab'='ab ', BINARY 'ab'='ab ' 
+0

Супер педантичное наблюдение: оператор 'BINARY' здесь не« заставляет двоичную сортировку », что было бы достигнуто применением предложения COLLATE * _bin', а скорее отличает его небинный операнд к двоичной строке - эффект поэтому сравнение состоит в том, что сравнение выполняется в точности побайтно, что похоже на то, что будет делать двоичная сортировка (за исключением того, что двоичные сопоставления все еще PADSPACE). Читатели могут счесть полезным узнать об этом различии, более подробно описанном в разделе руководства [_bin и двоичные коллажи] (https://dev.mysql.com/doc/en/charset-binary-collations.html) , – eggyal

+0

Спасибо, эти разъяснения никогда не будут неуместны. Я бы даже не отказался от того, что на самом деле имел в виду «двоичное сравнение», но просто ошибся - я делаю это довольно часто :) –

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