2010-03-30 26 views
28

Estoy convirtiendo un sitio web de ISO a UTF-8, así que también necesito convertir la base de datos MySQL.Convertir una base de datos MySQL de latín a UTF-8

En Internet, leo varias soluciones, no sé cuál elegir.

¿Es realmente necesario para convertir mis columnas varchar a binario, a continuación, a UTF-8 así:

ALTER TABLE t MODIFY col BINARY(150); 
ALTER TABLE t MODIFY col CHAR(150) CHARACTER SET utf8; 

Se necesita mucho tiempo para hacer eso para cada columna, de cada mesa, de cada base de datos .

Tengo 10 bases de datos, con 20 tablas cada una, con alrededor de 2 - 3 columnas varchar (2 consultas cada columna), esto me da alrededor de 1000 consultas para escribir! ¿Cómo hacerlo?

Resuelta: que enviar el código que he utilizado:

PASSWORD="" 
db=$1 

mysqldump --password=$PASSWORD --set-charset --skip-set-charset --add-drop-table --databases "$db" > /home/dev/backup/bdd.sql 

QUERY="ALTER DATABASE \`$db\` DEFAULT CHARACTER SET utf8;" 
mysql --password=$PASSWORD --database "$db" -e "$QUERY" 

mysql --password=$PASSWORD --default-character-set=utf8 < /home/dev/backup/bdd.sql 

Véase la respuesta a continuación para obtener más información.

+2

no son '-set-charset' y '--skip-set-charset' compitiendo directamente banderas? Los documentos dicen que afectan el uso de 'SET NAMES', pero no configuran el parámetro' DEFAULT CHARSET = X' que se envía a través de 'mysqldump' por tabla. (mysql 5.5) – fideloper

Respuesta

19

Puede hacerlo fácilmente usando un volcado. Hacer un volcado utilizando

mysqldump --skip-opt --set-charset --skip-set-charset 

A continuación, cree otra base de datos, establece su carácter predeterminado establece en UTF-8 y luego cargar el volcado de vuelta con:

mysql --default-character-set=<your iso encoding> 

La idea principal es hacer un volcado sin ningún signo de codificación de datos.
Por lo tanto, en el momento de la creación, la codificación de la tabla se heredaría de la codificación de la base de datos y se establecería en UTF-8. Y con --default-character-set le decimos a MySQL que recodifique nuestros datos automáticamente.

+0

¡Oh, esto parece agradable! ¿Por qué no está eso en la documentación, o nadie habla de eso en ninguna parte, gracias lo probaré –

+0

@ Matthieu, ya que parece que vas a hacerlo con '--todas las bases de datos', por favor hazlo con precauciones. Realice una copia de seguridad y pruebe el algoritmo completo primero en una base de datos. –

+0

Bueno, acabo de probar (en una sola base de datos, para estar seguro) y esto no cambia la codificación de las columnas (todavía están en "latin"). Solo para estar seguro, para el mysqldump, los 3 parámetros no necesitan valores. –

6

estoy usando mysqldump Ver 10,11 Distrib 5.0.77

Por alguna razón creamos se omitió opciones de motor y AUTO_INCREMENT. Esto causó una gran cantidad de errores de inserción, porque auto_increment desapareció en los campos de clave primaria.

Esto funcionó para mí. Estoy usando --opt y el uso de sed para eliminar charset del archivo sql.

mysqldump -p --opt --skip-set-charset --add-drop-table dbname > /tmp/dbname.sql 
sed -i 's/DEFAULT CHARSET=latin1//g' /tmp/dbname.sql 
ALTER DATABASE dbname DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_danish_ci; 
mysql -p --default-character-set=utf8 db < /tmp/dbname.sql 
+1

Como Mysql 5.5 generará 'DEFAULT CHARSET = latin1', que' --default-character-set = utf8' no sobrescribirá en la importación, este paso es necesario. Usé 'sed -i 's/DEFAULT CHARSET = latin1/DEFAULT CHARSET = utf8/g'/tmp/dbname.sql' para establecerlo explícitamente en utf8. – fideloper

1
mysqldump --opt --skip-set-charset --default-character-set='latin1' -u root -p revive_adserver --result-file='dump.sql' 

vim dump.sql 

:%s/latin1/utf8/gi 

:wq 

mysql -u root -p 

ALTER DATABASE revive_adserver CHARACTER SET utf8; 

\q 

mysql -D revive_adserver -u root -p < dump.sql 
Cuestiones relacionadas