MySQL рассматривает AÄÖ как AAO?
Эти два запроса дают мне тот же результат:
select * from topics where name='Harligt';
select * from topics where name='Härligt';
Как это возможно? Кажется, что mysql переводит åäö в aao при его поиске. Есть ли способ отключить это?
Я использую кодировку utf-8 всюду, насколько я знаю. Эта же проблема возникает как из терминала, так и из php.
Ответы
Ответ 1
Да, это стандартное поведение в неязыковых сопоставлениях Юникода.
9.1.13.1. Наборы символов Юникода
Чтобы дополнительно проиллюстрировать, следующие равенства выполняются как в utf8_general_ci, так и в utf8_unicode_ci (эффект, который это имеет в сравнениях или при поиске, см. В разделе 9.1.7.7, "Примеры эффекта сопоставления"):
Ä = A Ö = O Ü = U
Смотрите также Примеры эффекта сопоставления
Вам нужно либо
-
использовать параметры сортировки, которые не имеют этой "функции" (а именно utf8_bin
, но имеют другие последствия)
-
использовать другое сопоставление только для запроса. Это должно работать:
select * from topics where name='Harligt' COLLATE utf8_bin;
это становится сложнее, если вы хотите сделать LIKE
без Ä = A
регистра, но не иметь преобразования Ä = A
umlaut. Я не знаю никакой сортировки mySQL, которая не учитывает регистр и не выполняет такого рода неявное преобразование умляута. Если кто-нибудь знает, мне было бы интересно узнать об этом.
Связанные с:
Ответ 2
Поскольку вы находитесь в Швеции, я бы рекомендовал использовать шведскую сортировку. Вот пример, показывающий разницу, которую он делает:
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.
Ответ 3
вы хотите проверить свои настройки сортировки, сортировка - это свойство, которое устанавливает, какие символы идентичны.
эти 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
Ответ 4
Здесь вы можете увидеть некоторые таблицы сопоставлений. http://collation-charts.org/mysql60/. Я не уверен, что используется utf8_general_ci, хотя.
Вот график для utf8_swedish_ci. Он показывает, какие символы он интерпретирует как одно и то же. http://collation-charts.org/mysql60/mysql604.utf8_swedish_ci.html
Ответ 5
Хотя сопоставление является одним из способов решения этой проблемы, мне кажется, что гораздо более простым способом является ключевое слово BINARY
:
SELECT 'a' = 'ä', BINARY 'a' = 'ä'
вернет 1|0
В твоем случае:
SELECT * FROM topics WHERE BINARY name='Härligt';
Смотрите также https://www.w3schools.com/sql/func_mysql_binary.asp