Вопрос по unicode, collation, mysql, utf-8 – MySQL регистро-независимый, но чувствительный к акценту UTF8 уникальный ключ

5

Я знаю, что есть много похожих вопросов по SF, но я думаю, что у меня достаточно разных вопросов, чтобы оправдать новый вопрос. У меня есть таблица, которая имеет один столбец как utf8 с utf8_unicode_ci. У этого также есть уникальный ключ на этом столбце наряду с другим столбцом, отмечающим код языка. Данные в столбце представлены различными шрифтами (латиницей с различными акцентами, китайским и русским, среди прочих).

Проблема в том, что мне иногда захочется ввести два слова с разными значениями, которые отличаются только диакритическим знаком (т. Е. По-испански ano против a & # xF1; o). Поскольку utf8_unicode_ci нечувствителен к регистру и акценту, он думает, что они одинаковы, и позволит мне ввести только один. Это отстой. В идеале я просто переключаю весь столбец на некоторое сопоставление, которое нечувствительно к регистру, но чувствительно к акценту, но, по-видимому, не существует. В этом столбце используется много разных вещей, поэтому я бы не стал менять параметры сортировки по умолчанию для столбца на utf8_bin из-за боязни путаницы с чувствительностью к регистру.

Итак, все это говорит о том, что мне нужно решение, которое не повлияет на чувствительность к регистру по умолчанию во многих существующих запросах, попадающих в этот столбец, но позволит мне добавить слова, отличающиеся только диакритическим знаком. Идеи? Я переключу только ограничение уникального ключа на utf8_bin, если мне придется, но я бы предпочел этого не делать, поскольку я никогда не хочу, чтобы в таблице были две вещи, которые различаются только в зависимости от конкретного случая.

Ваш Ответ

2   ответа
0

о) здесь.

В MySQL есть два сопоставления на испанском языке:

utf8_spanish_ci (современный испанский) и utf8_spanish2_ci (традиционный испанский)

Они знают язык достаточно хорошо, чтобы знать, что N и n должны быть сопоставлены вместе, но это & # xD1; и & # xF1; разные буквы между N и O. На испанском языке символ & # xD1; это на самом деле другое письмо, а не акцент.

Установите параметры сортировки столбцов в utf8_spanish_ci, и все будет работать так, как вы хотите.

Хм. Люди, которые придумали сопоставления Unicode, являются превосходными лингвистами. Если бы было универсальное решение, которое подходило бы для всех языков латинского алфавита, они бы реализовали его. Вам может потребоваться выполнить некоторые языковые запросы в зависимости от языка вашего пользователя. Вы можете поместить предложение COLLATE в инструкцию WHERE.
Спасибо, но, как я уже говорил, меня беспокоит не только испанский язык. Есть вещи на множестве разных языков. Eli
0

о чем я могу подумать (не найдя сопоставления, которое соответствует вашим потребностям), это изменить что-то на уровне приложений (за пределами MySQL), которое позаботится о дифференцировании.

Например, поскольку вы не заботитесь о регистре, вы можете сделать что-то программно, чтобы уменьшить регистр всех строк в базе данных. Затем измените параметры сортировки на utf8_bin.

Затем в приложении можно преобразовать все в строчные буквы, прежде чем они попадут в базу данных (я предполагаю, что это не повлияет на диакритические знаки). Таким образом, вы все равно будете получать ошибки, если люди попытаются ввести несколько случаев, вам нужно будет всего лишь изменить несколько строк кода, чтобы выполнить предварительные условия, входящие в таблицу, и у вас не возникнет проблема с диакритическими знаками.

Некоторые заглавные буквы не имеют строчных эквивалентов. У некоторых есть несколько строчных эквивалентов. Это своего рода беспорядок.

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