?

Log in

No account? Create an account

И ты бы, Ваня, у них был Vanä - Узором созвездий по мантии ночи

19.08.2014, Вторник

10:03:00 - И ты бы, Ваня, у них был Vanä

Previous Entry Поделиться Next Entry

Внезапно наткнулся на то, что MySQL при COLLATE utf8_general_ci (или utf8_unicode_ci) не различает не только большие и маленькие буквы (что как раз нужно, и суффиксу _ci соответствует), но также не отличает буквы с диакритикой от их "обычных" аналогов, в частности 'Melkor' == 'Melkör' и 'kossak' == 'KOŞŞAK'.

Если задать COLLATE utf8_bin -- то теряем и регистронезависимость, что не устраивает.

Погугли немного, поискал на http://stackoverflow.com -- похоже, решение на уровне базы данных отсутствует, т.е. придётся включать utf8_bin, а регистронезависимость реализовывать на уровне приложения.

This entry was originally posted at http://arilou.dreamwidth.org/946980.html. Please comment there using OpenID.

Comments:

[User Picture]
From:beldmit
Date:19.08.2014 08:31:42
(Link)
НЯП, регистронезависимость определяется в зависимости от локали.

Нельзя хранить какую-нибудь нормальную форму в качестве уникального ключа? А то при независимой реализации ты забудешь какой-нибудь вариант диакритики и огребешь.
(Ответить) (Thread)
[User Picture]
From:vitus_wagner
Date:19.08.2014 10:47:41
(Link)
Ну можно взять какую-нибудь libicu. И именно вынос нормализации регистра на уровень приложения позволит сделать эту нормализацию языкозависимой - хранить рядом со строкой язык, на котором она. А внутри базы так не сделаешь.
(Ответить) (Parent) (Thread)
[User Picture]
From:beldmit
Date:19.08.2014 11:25:57
(Link)
Я подозреваю, что Эль в базе хочет сделать уникальный ключ по вычислению функции от поля.
(Ответить) (Parent) (Thread)
[User Picture]
From:arilou
Date:19.08.2014 13:56:30
(Link)
Ну если нельзя без функции, то хотя бы по функции.
Никакой "зависимости от языка" сделать не можно.
Это ник игрока. Язык игрока нам не известен (известно, какая локализация клиента, но это ведь не то же самое).
Хотелось уникальный индекс. Т.е. база давно есть, в ней 2 миллиона записей. Начав смотреть один из багов, обнаружил, что индекс по никам неуникальный. Пошёл смотреть, а есть ли дубликаты ников -- нашёл с полсотни, большинство пар различались диакритикой (наличием/отсутствием) в некоторых буквах, типа примеров самом в посте.

Мне было любопытно, смогу ли я сделать уникальный индекс или придётся обойтись проверками на уровне приложения (они есть, но при том некоторый думы попали в базу в обход них).
(Ответить) (Parent) (Thread)
[User Picture]
From:beldmit
Date:19.08.2014 13:59:24
(Link)
Так чем тебя не устраивает вариант, когда диакритики при сравнении отрываются? Показываться они будут, а лишней путаницы ты избежишь.
(Ответить) (Parent) (Thread)
[User Picture]
From:arilou
Date:19.08.2014 14:03:49
(Link)
Устроит это или нет -- я ещё уточню у менеджеров. Это как бы не мне решать.
Ну т.е. я уже описал ситуацию. Позже уточню, чего в итоге хочется.
Но если диакритику отрывать -- придётся что-то делать с имеющимися дублями.
Поскольку некоторые запросы в сервере грустят, когда получают более одной записи в ответе. Если решить, что делать с дублями, вариант accent insensitive collation меня-то вполне устроит.
(Ответить) (Parent) (Thread)
[User Picture]
From:beldmit
Date:19.08.2014 14:09:15
(Link)
Ну либо запросы уточнять. Но ИМХО, самый плохой вариант - это изобретать тут свою функцию smth-independent comparison.
(Ответить) (Parent) (Thread)