Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 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.

Ответ 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