Pregunta

Estoy tratando de convertir algunas tablas MySQL desde latin1 a UTF-8. Estoy usando el siguiente comando, que parece sobre todo el trabajo.

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Sin embargo, en una mesa me sale un error acerca de una entrada de clave duplicada. Esto es causado por un índice único en un campo "Nombre". Parece que cuando la conversión a UTF-8, los caracteres "especiales" se indexan como su equivalente en Inglés recta. Por ejemplo, ya existe un registro con un valor de campo nombre de "Dru". Al convertir a UTF8, un registro con "Drü" se considera un duplicado. Lo mismo con "Patrick" y "Patrick".

Aquí es cómo reproducir el problema:

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
¿Fue útil?

Solución

La razón por la cual las cuerdas 'Drü' y 'Dru' evalúan como el mismo es que en el cotejo utf8_general_ci, cuentan como "el mismo". El propósito de un cotejo para un conjunto de caracteres es proporcionar un conjunto de reglas en cuanto a cuando las cadenas son iguales, cuando una clase antes que el otro, y así sucesivamente.

Si desea un conjunto diferente de reglas de comparación, tiene que elegir una intercalación diferente. Se puede ver las configuraciones que tienen disponible para el juego de caracteres utf8 mediante la emisión de SHOW COLLATION LIKE 'utf8%'. Hay un montón de colaciones, destinados para el texto que está sobre todo en un idioma específico; también existe la intercalación utf8_bin que compara todas las cadenas como cadenas binarias (es decir, los compara como secuencias de 0s y 1s).

Otros consejos

UTF8_GENERAL_CI es insensible acento.

Uso UTF8_BIN o una colación lenguaje específico.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top