Pregunta

he terminado con mal estado de codificación de caracteres en una de nuestras columnas de MySQL.

Normalmente tengo

v © lugar de E
v? en lugar de ö
v ? en lugar de i

y así sucesivamente ...

bastante seguro de que alguien aquí sería saber qué pasó y cómo solucionarlo.

ACTUALIZACIÓN: Sobre la base de la respuesta de bobince y desde que tuve estos datos en un archivo hice lo siguiente

#!/user/bin/env python
import codecs
f = codecs.open('./file.csv', 'r', 'utf-8')
f2 = codecs.open('./file-fixed.csv', 'w', 'utf-8')
for line in f:
    f2.write(line.encode('macroman').decode('utf-8')),

después de lo cual

load data infile 'file-fixed.csv' 
into table list1 
fields terminated by ',' 
optionally enclosed by '"' 
ignore 1 lines;

importada correctamente los datos.

Update2: Hammerite, simplemente para la corrección aquí están los datos que se solicitan ...

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     | 
| character_set_connection | latin1                     | 
| character_set_database   | latin1                     | 
| character_set_filesystem | binary                     | 
| character_set_results    | latin1                     | 
| character_set_server     | latin1                     | 
| character_set_system     | utf8                       | 
| character_sets_dir       | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+

El SHOW CREATE TABLE para la mesa Estoy importando que tiene DEFAULT CHARSET=utf8

Edit3:

En realidad, con los ajustes por encima de la load ¿verdad hacer lo correcto (no podía comparar a los campos utf8 existentes y sólo mis datos cargados mirado como si fuera cargado correctamente; supongo que debido a los mal, pero a juego cliente, la conexión y resultados conjuntos de caracteres), por lo que he actualizado la configuración a:

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       | 
| character_set_connection | utf8                       | 
| character_set_database   | utf8                       | 
| character_set_filesystem | binary                     | 
| character_set_results    | utf8                       | 
| character_set_server     | utf8                       | 
| character_set_system     | utf8                       | 
| character_sets_dir       | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+

cargado de datos de nuevo y luego finalmente me dieron los datos cargados correctamente (comparable con los datos existentes).

¿Fue útil?

Solución

Su texto ha sido codificado en UTF-8 y luego re-decodificado, erróneamente, como Mac Romano .

Usted no será capaz de solucionar este problema dentro de la base de datos, como MySQL no conoce la codificación Mac romano. Es posible escribir un script para caminar cada fila de cada tabla afectada y fijar el texto invirtiendo el ciclo de codificación / decodificación. Python es una posibilidad, que tiene un intervalo bien de codificaciones:

>>> print u'é'.encode('macroman').decode('utf-8')
é
>>> print u'ö'.encode('macroman').decode('utf-8')
ö
>>> print u'í'.encode('macroman').decode('utf-8')
í

Como alternativa, si no hay contenido no ASCII que no se ve afectado por este problema, se podría tratar de usar mysqladmin exportar un volcado SQL, a continuación, convertir todo a la vez, ya sea usando un script que el anterior o, si tiene una editor de texto (presumiblemente en el Mac) que pueden hacerlo, se carga el script como UTF-8 y luego guardarlo como Mac romano. Finalmente vuelva a importar el volcado utilizando mysql < dump.sql.

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