MySQL рассматривает ÅÄÖ как AAO?

Эти два запроса дают мне тот же самый результат:

select * from topics where name='Harligt';
select * from topics where name='Härligt';

Как это возможно? Кажется, что mysql переводит åäö в aao, когда он ищет. Там некоторый путь состоит в том, чтобы выключить это?

Я использую utf-8, кодирующий везде насколько я знаю. Та же проблема происходит и от терминала и от php.

31
задан Josh Lee 9 April 2010 в 12:04
поделиться

3 ответа

Да, это стандартное поведение в сопоставлениях Unicode, не зависящих от языка.

9.1.13.1. Наборы символов Unicode

Для дополнительной иллюстрации, следующие равенства выполняются как в utf8_general_ci, так и в utf8_unicode_ci (о влиянии этого на сравнения или при выполнении поиска см. Раздел 9.1.7.7, «Примеры эффекта сопоставления»):

Ä = A Ö = O Ü = U

См. Также Примеры эффекта сопоставления

Вам нужно либо

  • использовать сопоставление, которое не ' У t есть эта «особенность» (а именно utf8_bin , но это имеет другие последствия)

  • использовать другое сопоставление только для запроса . Это должно работать:

     выберите * из тем, где name = 'Harligt' COLLATE utf8_bin; 
     

становится сложнее, если вы хотите сделать регистронезависимый LIKE , но не имеют преобразование Ä = A умляут.Я не знаю параметров сортировки mySQL, которые нечувствительны к регистру и не выполняют такого рода неявное преобразование умляута. Если кто-нибудь знает, мне было бы интересно узнать об этом.

Связано:

36
ответ дан 27 November 2019 в 22:32
поделиться

вы хотите проверить настройки collation, collation - это свойство, которое устанавливает, какие символы идентичны.

эти 2 страницы должны помочь вам

http://dev.mysql.com/doc/refman/5.1/en/charset-general.html

http://dev.mysql.com/doc/refman/5.1/en/charset-mysql.html

1
ответ дан 27 November 2019 в 22:32
поделиться

Поскольку вы находитесь в Швеции, я бы рекомендовал использовать шведскую сортировку. Вот пример, показывающий разницу:

CREATE TABLE topics (name varchar(100) not null) CHARACTER SET utf8;

INSERT topics (name) VALUES ('Härligt');

select * from topics where name='Harligt';
'Härligt'

select * from topics where name='Härligt';
'Härligt'    

ALTER TABLE topics MODIFY name VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_swedish_ci;

select * from topics where name='Harligt';
<no results>

select * from topics where name='Härligt';
'Härligt'

Обратите внимание, что в этом примере я изменил только один столбец на шведскую сортировку, но вам, вероятно, следует сделать это для всей вашей базы данных, всех таблиц, всех столбцов varchar.

5
ответ дан 27 November 2019 в 22:32
поделиться
Другие вопросы по тегам:

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