SELECT только пустые строки возвращают результат с пробелом
Этот SQL-запрос:
select c1 from table where c1='';
возвращает строки, имеющие c1=' '
(одно пустое пространство) в MySQL.
Это намечено или ошибка?
EDIT: пожалуйста, проверьте ссылку SQL Fiddle здесь, а количество пробелов в SELECT
не имеет значения.
Ответы
Ответ 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 ;