Как создать уникальный индекс Mysql без учета регистра с акцентированием - (или использовать БЕЗ сортировки)

Я борюсь с сопоставлениями. Я хочу создать таблицу с уникальным индексом слова, нечувствительным к регистру, но отличающим «а» от «а». Это означает, что "de" и "dé" должны быть двумя разными записями, но de, De, DE, dE должны быть одинаковыми.

Есть ли сопоставление utf8, которое выполняет эту работу (похоже, это не так)? Есть ли способ сказать mysql не использовать сопоставление? Есть ли другое решение? Я не хочу переводить слова в нижний или верхний регистр

Благодарность


person Sunny    schedule 22.05.2012    source источник


Ответы (1)


  1. #P1#
    #P2#
  2. #P3#
    #P4# #P5#
  3. #P6#
    #P7#
    SELECT col FROM my_table WHERE UPPER(col) LIKE UPPER('de') COLLATE utf8_bin
    
    #P8# #P9#
person eggyal    schedule 22.05.2012
comment
Спасибо за ваш ответ, который вполне ясен. Может быть, UPPER - лучшее решение, которое мне нужно, чтобы проверить, какой объем кода мне нужно будет изменить. Пройдя немного дальше, я увидел, что сопоставление Райта для моей таблицы — latin1_general_ci, но мне нужны другие таблицы в utf8, и я не могу заставить работать свое приложение с одной таблицей в utf8 и одной таблицей в latin1. Я использую рельсы, и если я скажу, что соединение с моей базой данных находится в utf8, все данные, поступающие из таблиц utf8, в порядке, но данные, поступающие из моей таблицы latin1, неверны. Есть идеи ? - person Sunny; 23.05.2012
comment
@Sunny: MySQL должен без проблем обрабатывать преобразование из набора символов таблицы в набор символов вашего подключения; поскольку этого не происходит, вполне вероятно, что данные в вашей таблице latin1 на самом деле не закодированы в latin1. Сначала вам нужно будет определить, в какой кодировке эти данные были сохранены, а затем вы можете преобразовать их. - person eggyal; 23.05.2012
comment
это то, что я думал, но это было не то, что я наблюдал. Я попробую еще раз побороться с кодировкой этой таблицы, чтобы убедиться, что она хранится в настоящей латинице1. Я дам Вам знать. Создание новой сортировки из юникода тоже хорошая идея, не уверен, что акцентов так много, думаю около сотни и перекомпилировать mysql не нужно - person Sunny; 23.05.2012
comment
Хорошо, вы были правы, таблица была дважды плохо закодирована ^ (и не только одна, как я думал), поэтому теперь я могу смешать 2 сопоставления. Спасибо за вашу помощь - person Sunny; 23.05.2012
comment
Хорошо, на самом деле кажется, что я почти трахаюсь, моя таблица содержит символы utf8, такие как китайский или арабский, поэтому мне приходится использовать utf8, метод upper(col) прерывает поиск по индексу, поэтому он неэффективен. Два решения: создание моей собственной сортировки, включающей только основной европейский акцент, добавление еще одного столбца, где все в нижнем регистре, и использование индекса для этого столбца с сопоставлением, например utf8_bin. - person Sunny; 23.05.2012