Вопрос

Я пытаюсь преобразовать некоторые таблицы MySQL от Latin1 в UTF8. Я использую следующую команду, которая, кажется, в основном работает.

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Однако на одной таблице я получаю сообщение о дублирующей ключевой записи. Это вызвано уникальным индексом на поле «Имя». Похоже, что при преобразовании в UTF8 любые «специальные» персонажи проиндексируются как их прямой английский эквивалент. Например, уже есть запись с именем поля поля «DRU». При преобразовании в UTF8 запись с «DRI» считается дубликатом. То же самое с «Патриком» и «Påtrìchk».

Вот как воспроизвести вопрос:

CREATE TABLE `example` (   `name` char(20) CHARACTER SET latin1 NOT NULL,
  PRIMARY KEY (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO example (name) VALUES ('Drü'),('Dru'),('Patrick'),('Påtrìçk');

ALTER TABLE example convert to character set utf8 collate utf8_general_ci;
ERROR 1062 (23000): Duplicate entry 'Dru' for key 1
Это было полезно?

Решение

Причина, по которой строки 'Drü' а также 'Dru' оценить как то же самое, что в utf8_general_ci Собрание, они считают как «то же самое». Цель сопоставление Для набора символов состоит в том, чтобы обеспечить набор правил относительно того, когда строки одинаковы, когда один сортирует до другой, и так далее.

Если вы хотите другой набор правил сравнения, вам нужно выбрать другое сопоставление. Вы можете увидеть доступные сопоставления для utf8 персонаж установлен путем выдачи SHOW COLLATION LIKE 'utf8%'. Отказ Есть куча сопоставлений, предназначенных для текста, в основном на конкретном языке; есть также utf8_bin Собрание, которое сравнивает все строки в качестве двоичных струн (то есть сравнивает их как последовательности 0s и 1s).

Другие советы

UTF8_GENERAL_CI это нечувствительна акцентом.

Использовать UTF8_BIN или, специфичное для языка сопоставление.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top