Преобразование таблиц mysql из latin1 в utf8 - PullRequest
16 голосов
/ 01 ноября 2010

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

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Однако в одной таблице я получаю сообщение об ошибке ввода дублированного ключа.Это вызвано уникальным индексом в поле «имя».Кажется, что при конвертации в utf8 любые «специальные» символы индексируются как их прямой английский эквивалент.Например, уже есть запись со значением поля имени «Dru».При преобразовании в utf8 запись с "Drü" считается дубликатом.То же самое с «Patrick» и «Påtrìçk».

Вот как воспроизвести проблему:

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

Ответы [ 2 ]

20 голосов
/ 01 ноября 2010

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

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

3 голосов
/ 01 ноября 2010

UTF8_GENERAL_CI нечувствителен к акценту.

Используйте UTF8_BIN или сопоставление для конкретного языка.

...