Ответ 1
Как описано в CHAR
и VARCHAR
Типы:
Все сопоставления MySQL имеют тип
PADSPACE
. Это означает, что все значенияCHAR
иVARCHAR
в MySQL сравниваются без учета каких-либо конечных пробелов.
В определении оператора LIKE
в руководстве указано:
В частности, конечные пробелы значительны, что неверно для
CHAR
илиVARCHAR
, выполненные с помощью оператора=
:
Как упоминалось в этом ответе:
Это поведение указано в SQL-92 и SQL: 2008. Для целей сравнения более короткая строка дополняется длиной более длинной строки.
Из черновика (8.2 < предикат сравнения > ):
Если длина символов в X не равна длине символов Y, то более короткая строка эффективно заменяется для целей сравнения с самой копией, которая была расширена до длины более длинной строка путем конкатенации справа от одного или нескольких символов пэда, где символ пэда выбирается на основе CS. Если CS имеет характеристику NO PAD, тогда символ прокладки является зависимым от реализации символом, отличным от любого символа в наборе символов X и Y, который сравнивается с любой строкой под CS. В противном случае символ прокладки будет <space> .
Одно решение:
SELECT * FROM Foo WHERE CHAR_LENGTH(field) != CHAR_LENGTH(TRIM(field))