MySQL – почему правила COLLATION игнорируются оператором LIKE для немецкого символа ß

Я запускаю следующие операторы select в MySQL 5.0.88 с кодировкой utf8 и сопоставлением utf8_unicode_ci:

SELECT * FROM table WHERE surname = 'abcß';

+----+-------------------+------+
| id | forename    | surname    |
+----+-------------------+------+
|  1 | a           | abcß       |
|  2 | b           | abcss      |
+----+-------------+------------+

SELECT * FROM table WHERE surname LIKE 'abcß';

+----+-------------------+------+
| id | forename    | surname    |
+----+-------------------+------+
|  1 | a           | abcß       |
+----+-------------+------------+

Согласно http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html специальный немецкий символ ß = ss для utf8_unicode_ci, но почему он работает только с оператором "=", а не с LIKE? У меня есть приложение телефонной книги, и мне очень нужно, чтобы обе вещи работали вместе.


person sub    schedule 27.10.2011    source источник
comment
что показывают show variables like '%collation%' и show full fields from yourtable? Сопоставление должно быть одинаковым во всем.   -  person Marc B    schedule 27.10.2011
comment
сопоставление для всех полей varchar таблицы установлено на utf8_unicode_ci + некоторые поля int без сопоставления вообще.   -  person sub    schedule 27.10.2011
comment
+1 очень интересный вопрос, рад услышать ответ.   -  person Johan    schedule 27.10.2011
comment
collation_connection — utf8_unicode_ci, collation_database — utf8_unicode_ci, collation_server — latin1_swedish_ci. Однако я думал, что сопоставление сервера перекрывается сопоставлением базы данных, иначе я не могу объяснить, почему это работает с оператором =   -  person sub    schedule 27.10.2011


Ответы (1)


Согласно стандарту SQL, LIKE выполняет сопоставление для каждого символа, поэтому он может давать результаты, отличные от оператора сравнения =:

mysql> SELECT 'ä' LIKE 'ae' COLLATE latin1_german2_ci;
+-----------------------------------------+
| 'ä' LIKE 'ae' COLLATE latin1_german2_ci |
+-----------------------------------------+
|                                       0 |
+-----------------------------------------+
mysql> SELECT 'ä' = 'ae' COLLATE latin1_german2_ci;
+--------------------------------------+
| 'ä' = 'ae' COLLATE latin1_german2_ci |
+--------------------------------------+
|                                    1 |
+--------------------------------------+

Источник: http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html#operator_like

person Karolis    schedule 27.10.2011
comment
Спасибо Каролис. Кажется, у меня не может быть и того, и другого, что отстой для большого приложения телефонной книги с большим количеством специальных символов. Возможно, поиск mysql FULLTEXT может быть альтернативой. - person sub; 27.10.2011