Преобразование таблиц MySQL от Latin1 в UTF8
-
28-09-2019 - |
Вопрос
Я пытаюсь преобразовать некоторые таблицы 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
или, специфичное для языка сопоставление.