utf8_decode utf8 name from convert column charset change cast mysql utf-8 collation latin1 mysql-error-1062

mysql - name - utf8_decode sql server



Convertir tablas mysql de latin1 a utf8 (2)

La razón por la que las cadenas ''Drü'' y ''Dru'' evalúan de la misma manera es que en la intercalación utf8_general_ci , cuentan como "las mismas". El propósito de una intercalación para un conjunto de caracteres es proporcionar un conjunto de reglas sobre cuándo las cadenas son iguales, cuando una se ordena antes que la otra, y así sucesivamente.

Si desea un conjunto diferente de reglas de comparación, debe elegir una intercalación diferente. Puede ver las intercalaciones disponibles para el utf8 caracteres utf8 emitiendo SHOW COLLATION LIKE ''utf8%'' . Hay un montón de intercalaciones destinadas a texto que se encuentran principalmente en un idioma específico; también existe la utf8_bin que compara todas las cadenas como cadenas binarias (es decir, las compara como secuencias de 0 y 1).

Estoy tratando de convertir algunas tablas mysql de latin1 a utf8. Estoy usando el siguiente comando, que parece funcionar principalmente.

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Sin embargo, en una tabla recibo un error sobre una entrada de clave duplicada. Esto se debe a un índice único en un campo de "nombre". Parece que al convertir a utf8, los caracteres "especiales" se indexan como su equivalente en inglés directo. Por ejemplo, ya existe un registro con un valor de campo de nombre de "Dru". Cuando se convierte a utf8, un registro con "Drü" se considera un duplicado. Lo mismo con "Patrick" y "Påtrìçk".

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


UTF8_GENERAL_CI es insensible al acento.

Utilice UTF8_BIN o una intercalación específica por idioma.