2009-09-17 88 views
8

Importé algunos datos utilizando LOAD DATA INFILE en una base de datos MySQL. La tabla en sí y las columnas están utilizando el juego de caracteres UTF8, pero el juego de caracteres predeterminado de la base de datos es latin 1. Como el tipo de carácter predeterminado de la base de datos es latin1, y usé LOAD DATA INFILE sin especificar un juego de caracteres, interpretó el archivo como latin1, aunque los datos en el archivo eran UTF8. Ahora tengo un montón de datos mal codificados en mi columna UTF8. Encontré this article que parece resolver un problema similar, que es "UTF8 insertado en cp1251", pero mi problema es "Latin1 insertado en UTF8". Intenté editar las consultas para convertir los datos de latin1 a UTF8, pero no puedo hacer que funcionen. O bien los datos salen igual, o incluso más destrozados que antes. Solo a modo de ejemplo, la palabra Québec se muestra como Québec.MySQL Convertir datos latin1 a UTF8

[INFO ADICIONAL]

al seleccionar los datos envueltas en HEX(), Quà © bec tiene el valor 5175C383C2A9626563.

La tabla Crear (acortada) de esta tabla es.

CREATE TABLE MyDBName.`MyTableName` 
(
`ID` INT NOT NULL AUTO_INCREMENT, 
....... 
`City` CHAR(32) NULL, 
....... 
`)) ENGINE InnoDB CHARACTER SET utf8; 
+0

publique la sentencia CREATE TABLE para la tabla en cuestión, junto con un par de filas rotas, pero envuelva la columna rota en hex(), de esta manera: 'SELECT HEX (nombre) DE LAS CIUDADES LÍMITE 5'. con esta información, puedo ayudarlo a encontrar la manera correcta de corregirlo de acuerdo con ese artículo. (Por cierto: ¡me encanta ese artículo! Me ha salvado muchas veces.) – longneck

Respuesta

1

Convertir latin1 a UTF8 no es lo que quieres hacer, necesitas todo lo contrario.

Si lo que realmente sucedió fue lo siguiente:

  1. cadenas UTF-8 fueron interpretados como América-1 y transcodificar a UTF-8, destrozando ellos.
  2. Ahora está, o puede estar, lectura cadenas UTF-8 sin más la interpretación

Lo que debe hacer ahora es:

  1. Lea el "UTF-8" sin transcodificación.
  2. Convertirlo a Latin-1. Ahora deberías tener el UTF-8 original.
  3. Ahora colóquelo en su columna "UTF-8" sin más conversiones.
2

CARGA LOAD DATA le permite establecer un archivo de codificación se supone que es en:

http://dev.mysql.com/doc/refman/5.1/en/load-data.html

+0

Sí, ojalá me hubiera dado cuenta de esto antes, pero ahora los datos ya están destrozados. Quería saber si podría arreglarlo sin volver a importarlo. – Kibbee

+0

¡Sí! Esta es la opción: [CHARACTER SET charset_name] –

11

que he tenido casos como este en viejas instalaciones de WordPress con el problema de que son los propios datos ya estaba en UTF-8 dentro de una base de datos Latin1 (debido al juego de caracteres predeterminado de WP). Esto significa que no hubo una necesidad real de conversión de los datos, sino los formatos ddbb y table. En mi experiencia, las cosas se complican al hacer el volcado, ya que entiendo que MySQL usará el juego de caracteres predeterminado del cliente, que en muchos casos ahora es UTF-8. Por lo tanto, asegúrese de que exportar con la misma codificación de los datos es muy importante. En caso de Latin1 BBDD con codificación UTF-8:

$ mysqldump –default-character-set=latin1 –databases wordpress > m.sql 

luego vuelva a colocar las referencias Latin1 dentro del vertedero exportado antes de volver a importar a una nueva base de datos en UTF-8. Algo así:

$ replace "CHARSET=latin1" "CHARSET=utf8" \ 
    "SET NAMES latin1" "SET NAMES utf8" <m.sql> m2.sql 

En mi caso this link fue de gran ayuda. Comentada here in spanish.

+0

He visto los volcados de MySQL donde este comando de reemplazo no era suficiente porque algunas columnas se establecieron explícitamente en latin1. Hice 'replace" latin1 "" utf8mb4 " dump.utf8.sql' para hacer que todo en esa tabla use UTF-8. Sin embargo, tenga en cuenta que "latin1" no se produjo en ningún otro lugar en el volcado (contenido del campo) y, solo para asegurarse, revisé el diff antes de importarlo. – basic6

7

Aunque todavía no es real para el OP, he encontrado una solución en la documentación de MySQL para ALTER TABLE. Lo pongo aquí sólo para referencia futura:

Advertencia

Convertir a operación convierte valores de columna entre los conjuntos de caracteres. Esto no es lo que desea si tiene una columna en un juego de caracteres (como latin1) pero los valores almacenados realmente usan algún otro juego de caracteres incompatible (como utf8). En este caso, usted tiene que hacer lo siguiente para cada una de tales columnas:

ALTER TABLE t1 CHANGE c1 c1 BLOB; 
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8; 

La razón por la que esto funciona es que no hay conversión al convertir hacia o desde las columnas BLOB.

+0

Esto funcionó para mí. ¡Gracias! – riverstorm

+0

Con contenido mixto, esto no funciona: Código: 1366 SQL Estado: HY000 --- Valor de cadena incorrecto: '\ xE4chste ...' para la columna 'kommentar' en la fila 1 –

0

Prueba esto:

1) Volcado de su base de datos

mysqldump --default-character-set=latin1 -u username -p databasename < dump.sql 

2) dump.sql Abrir en editor de texto y reemplazar todas las ocurrencias de "ajustar nombres de latin1" por "ajustar nombres UTF-8"

3) Crear una nueva base de datos y restaurar su dumpfile

cat dump.sql | mysql -u root -p newdbname 
1

Recientemente completé un script de shell que automatiza el proceso de conversión. También es configurable para escribir filtros personalizados para cualquier texto que desee reemplazar o eliminar. Por ejemplo: eliminar caracteres HTML, etc. También son posibles listas blancas y listas negras de tablas. Puede descargarlo en sourceforge: https://sourceforge.net/projects/mysqltr/

Cuestiones relacionadas