Вопрос по mysql – Оператор сравнения MySQL, пробелы

9

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

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

Ваш Ответ

5   ответов
1

like или с этим

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

All MySQL collations are of type PADSPACE. This means that all CHAR and VARCHAR values in MySQL are compared without regard to any trailing spaces [...] This is true for all MySQL versions, and is not affected by the server SQL mode.

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

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

SELECT 'ab'='ab ', BINARY 'ab'='ab '
Error: User Rate Limit ExceededBINARYError: User Rate Limit ExceededCOLLATE *_binError: User Rate Limit ExceededThe _bin and binary Collations.
Error: User Rate Limit Exceeded
9

руководство:

All MySQL collations are of type PADSPACE. This means that all CHAR and VARCHAR values in MySQL are compared without regard to any trailing spaces.

В определенииLIKE оператор, он заявляет:

In particular, trailing spaces are significant, which is not true for CHAR or VARCHAR comparisons performed with the = operator:

этот ответ:

This behavior is specified in SQL-92 and SQL:2008. For the purposes of comparison, the shorter string is padded to the length of the longer string.

From the draft (8.2 <comparison predicate>):

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 characters, where the pad character is chosen based on CS. If CS has the NO PAD characteristic, then the pad character is an implementation-dependent character different from any character in the character set of X and Y that collates less than any string under CS. Otherwise, the pad character is a <space>.

In addition to the other excellent solutions:

select binary 'a' = 'a   '
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededfix?
4

char или жеvarchar; с помощьюlike 'usa ' решает проблему

+1, dev.mysql.com/doc/refman/5.0/en/char.htmlError: User Rate Limit Exceeded
0

Можете прочитать больше об этом по следующей ссылке:

http://blogs.agilefaqs.com/2011/06/22/trailing-white-spaces-are-ignored-by-mysql-for-comparison-in-a-select-statement/

Похожие вопросы