mysql не учитывает акценты при проверке уникальности ключа индекса - PullRequest
1 голос
/ 06 января 2010

У меня есть таблица только с одним полем с именем "tag", которое является varchar (250)

поле определено с помощью сопоставления 'latin1_spanish_ci', потому что я планирую сохранить слова на испанском ...

проблема в том, что следующий запрос

select * from test where tag = 'unó'

дает мне точно такой же результат, как и

select * from test where tag = 'uno'

то есть для mysql 'uno' = 'unó' ... и 'unò', и 'unö' ... etc ...

это поле должно иметь уникальный ключ ...

Я пробовал с другими сопоставлениями, кажется, что все сопоставления "bin" работают, а также latin1_general_ci ...

Я просто хотел бы знать, будет ли это подходящим сопоставлением для каждого поля в базе данных, или если у меня могут возникнуть какие-либо проблемы с его выбором ... учтите, что я планирую хранить испанские данные в этой БД ...

Saludos

1021 * SAS *

ps: во всяком случае, кажется странным, что в испанском сопоставлении акценты можно считать бессмысленными ...

-

edit: я сделал пару тестов, я ввел данные с помощью Á é é ñ ñ Ñ и т. Д., И похоже, что mysql действительно может с ними справиться ...

Ответы [ 4 ]

2 голосов
/ 10 февраля 2010

Вы можете использовать latin1_general_ci в качестве сопоставления базы данных / таблицы / столбца по умолчанию и указать latin1_spanish_ci для каждого отдельного случая, где это необходимо:

select * from test order by tag collate latin1_spanish_ci;
select * from test where tag = 'uno' collate latin1_spanish_ci;

Поскольку 'o', 'ó' и т. Д. Считаются равными в latin1_spanish_ci, последний оператор возвращает несколько результатов, если таблица содержит, например, 'uno', 'unó' и 'unò'.

1 голос
/ 11 декабря 2017

Параметры сортировки не используются для определения того, на каком языке данные в столбце. Он используется для определения того, как разные буквы или несколько букв / кодовых точек должны быть определены как одинаковые для сравнений (упорядочение и равенство).

ci суффикс latin1_spanish_ci означает без учета регистра .

Если вы хотите различить любую подчеркнутую букву и любой случай, то сопоставление, названное в честь названия языка, не подходит. Вместо этого используйте сопоставления с суффиксом _bin.

Вы также можете прикрепить конкретное сопоставление к значению, чтобы принудительно использовать конкретное сопоставление для сопоставления столбца:

SELECT * FROM test WHERE tag = ('uno' COLLATE latin1_bin);
0 голосов
/ 04 декабря 2018

это быстрое решение этой проблемы.

'unó' должен быть сохранен как 'un ó' в вашей базе данных.

Тогда ваш поиск должен выглядеть как

SELECT * из базы данных, где поле = 'un ó'

Использование UNICODE HTML ENTITY - ключ https://www.compart.com/en/unicode/U+00F3 ... Приветствия!

0 голосов
/ 08 января 2010

Вы можете использовать сопоставление UTF-8 для дифференциации значения.

...