Question

Je suis en train de convertir des tables de MySQL de latin1 à UTF8. J'utilise la commande suivante, qui semble fonctionner la plupart du temps.

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Cependant, sur une table, j'obtiens une erreur sur une entrée clé en double. Ceci est causé par un index unique sur un champ « nom ». Il semble lors de la conversion en UTF8, tous les caractères « spéciaux » sont indexés comme leur équivalent anglais droite. Par exemple, il existe déjà un record avec une valeur de champ de nom de « Dru ». Lors de la conversion en UTF8, un enregistrement avec « Drü » est considéré comme un double. La même chose avec "Patrick" et "PaTriCK".

Voici comment reproduire le problème:

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
Était-ce utile?

La solution

La raison pour laquelle les chaînes 'Drü' et 'Dru' évaluent comme le même que dans le classement utf8_general_ci, ils comptent comme « le même ». Le but d'un collation pour un jeu de caractères est de fournir un ensemble de règles quant au moment où les chaînes sont les mêmes, quand on trie avant l'autre, et ainsi de suite.

Si vous voulez un autre ensemble de règles de comparaison, vous devez choisir un classement différent. Vous pouvez voir les classements sont disponibles pour le caractère utf8 ensemble par l'émission SHOW COLLATION LIKE 'utf8%'. Il y a un tas de texte destinés à des classements qui est la plupart du temps dans une langue spécifique; il y a aussi le classement par utf8_bin qui compare toutes les chaînes sous forme de chaînes binaires (à savoir les compare en tant que séquences de 0 et de 1).

Autres conseils

UTF8_GENERAL_CI est insensible accent.

Utilisez UTF8_BIN ou un classement spécifique de langue.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top