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

SELECT только пустые строки возвращают результат с пробелом

Этот SQL-запрос:

select c1 from table where c1='';

возвращает строки, имеющие c1=' ' (одно пустое пространство) в MySQL.

Это намечено или ошибка?

EDIT: пожалуйста, проверьте ссылку SQL Fiddle здесь, а количество пробелов в SELECT не имеет значения.

4b9b3361

Ответ 1

Все это указано в документации. Я процитировал важные моменты здесь. Но я бы предложил пройти полную документация

Значения VARCHAR не заполняются при их сохранении. Трейлинг пространства сохраняются, когда значения сохраняются и извлекаются, в соответствии с стандартный SQL.

С другой стороны, значения CHAR дополняются, когда они сохраняются, но Заканчивающиеся пробелы игнорируются при извлечении.

введите описание изображения здесь

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

Объяснение: Trailing spaces игнорируются при сравнении строк с использованием оператора сравнения ('='). Но конечные пробелы значимы для LIKE (pattern matching operator)

Ответ 2

Это документированное поведение.

Документация MySQL для LIKE упоминает

конечные пробелы значительны, , что неверно для CHAR или Сравнение VARCHAR выполняется с помощью оператора:

SQL Server работает одинаково.

Ответ 3

Если ваш столбец имеет тип CHAR, а не VARCHAR, это верно. На CHAR -Fields будут заканчивать пробелы при сравнении игнорируемых! Итак,

field = ''
field = '    '

совпадают.

Ответ 4

Это поведение соответствует стандарту ANSI SQL-92. Любая база данных, соответствующая этому стандарту, будет демонстрировать такое же поведение. Цитата:

3) The comparison of two character strings is determined as fol-
   lows:

   a) If the length in characters of X is not equal to the length
     in characters of Y, then the shorter string is effectively
     replaced, for the purposes of comparison, with a copy of
     itself that has been extended to the length of the longer
     string by concatenation on the right of one or more pad char-
     acters, where the pad character is chosen based on CS. If
     CS has the NO PAD attribute, then the pad character is an
     implementation-dependent character different from any char-
     acter in the character set of X and Y that collates less
     than any string under CS. Otherwise, the pad character is a
     <space>.

   b) The result of the comparison of X and Y is given by the col-
     lating sequence CS.

Таким образом, согласно этим спецификациям 'abc' = 'abc ' и '' = ' ' вычисляется значение true (но '' = '\t' является ложным).

Ответ 5

Если c1 равно CHAR(1), это верно, поскольку столбцы CHAR фиксированная ширина и при необходимости заполняются пробелами.

Итак, если вы поместите '' в поле CHAR(1), вы получите ' ' on SELECT ing. Кроме того, фильтрация для пустой строки даст ' '.

Пожалуйста, примите ответ Мартина Смита, поскольку он дал мне верный намек.

Кроме того, согласно документации по MySQL, при сравнении строк с = игнорируется пробел в пробелах, поэтому, если ваш столбец c1 содержит только пробелы (или один в вашем случае), он будет возвращен, даже если вы фильтруете WHERE c1 = '':

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

mysql> SELECT 'a' = 'a ', 'a' LIKE 'a ';
+------------+---------------+
| 'a' = 'a ' | 'a' LIKE 'a ' |
+------------+---------------+
|          1 |             0 |
+------------+---------------+
1 row in set (0.00 sec)

Забастовкa >

Ответ 6

Попробуйте это -

Select case when c1 = '' then ' ' else c1 end from table ;