MySQL рассматривает АА как AAO? - PullRequest
31 голосов
/ 09 апреля 2010

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

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

Как это возможно? Похоже, что mysql переводит åäö в aao при поиске. Есть ли способ отключить это?

Насколько я знаю, я везде использую кодировку utf-8. Одна и та же проблема возникает как с терминала, так и с php.

Ответы [ 5 ]

36 голосов
/ 09 апреля 2010

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

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

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

А = А Ö = O Ü = U

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

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

  • используйте параметры сортировки, которые не имеют этой "функции" (а именно utf8_bin, но имеют другие последствия)

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

    select * from topics where name='Harligt' COLLATE utf8_bin;
    

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

Связанный:

5 голосов
/ 09 апреля 2010

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

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..

1 голос
/ 09 апреля 2010

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

эти 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

0 голосов
/ 10 декабря 2018

Хотя сопоставления являются одним из способов решения этой проблемы, мне кажется, что более простым способом является ключевое слово BINARY:

 SELECT 'a' = 'ä', BINARY 'a' = 'ä'

вернется 1|0

В вашем случае:

SELECT * FROM topics WHERE BINARY name='Härligt';

См. Также https://www.w3schools.com/sql/func_mysql_binary.asp

0 голосов
/ 12 апреля 2015

Здесь вы можете увидеть некоторые таблицы сортировки. http://collation -charts.org / mysql60 / . Я не уверен, какой именно utf8_general_ci используется.

Вот график для utf8_swedish_ci. Он показывает, какие символы он интерпретирует как одинаковые. http://collation -charts.org / mysql60 / mysql604.utf8_swedish_ci.html

...