Подтвердить что ты не робот

MySQL выбирает поля, содержащие начальные или конечные пробелы

Я могу использовать метод MySQL TRIM() для очистки полей, содержащих ведущие или конечные пробелы, с UPDATE следующим образом:

UPDATE Foo SET field = TRIM(field);

Я бы хотел увидеть, как эти поля будут влиять, прежде чем это запустится. Я попробовал это, но возвращает 0 результатов:

SELECT * FROM Foo WHERE field != TRIM(field);

Похоже, это должно работать, но это не так.

У кого-нибудь есть решение? Также любопытно, почему это не работает...

4b9b3361

Ответ 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))

Ответ 2

SELECT *
FROM 
    `foo`
WHERE 
   (name LIKE ' %')
OR 
   (name LIKE '% ')

Ответ 3

Вот пример с RegEx

SELECT *
FROM 
    'foo'
WHERE 
   (name REGEXP '(^[[:space:]]|[[:space:]]$)')