2008-10-13 17 views
7

La base de datos MySQL utilizada por mi aplicación Rails actualmente tiene la intercalación predeterminada de latin1_swedish_ci. Como el juego de caracteres predeterminado de las aplicaciones de Rails (incluido el mío) es UTF-8, me parece sensato utilizar la intercalación utf8_general_ci en la base de datos.¿Debo migrar una base de datos MySQL con una intercalación latin1_swedish_ci a utf-8 y, de ser así, cómo?

¿Mi razonamiento es correcto?

Suponiendo que lo sea, ¿cuál sería el mejor enfoque para migrar la intercalación y todos los datos en la base de datos a la nueva codificación?

Respuesta

1

Convertir a UTF-8 como el conjunto de caracteres.

configuración de intercalación sólo se utilizan para clasificar y cosas por el estilo. Elija la intercalación que la mayoría de sus usuarios esperaría.

4

UTF-8, así como cualquier otro esquema de codificación Unicode, puede almacenar caracteres en cualquier idioma, por lo que es una excelente opción de página de códigos de la base de datos.

La configuración de intercalación, por el contrario, es un tema completamente separado del esquema de codificación. Incluye órdenes de clasificación, conversiones de mayúsculas/minúsculas, comparaciones de igualdad de cadenas y cosas por el estilo que son específicas del idioma. La configuración de intercalación debe coincidir con el idioma que se utiliza en la base de datos.

La intercalación general UTF-8 es (estoy asumiendo aquí -no estoy familiarizado con MySQL en particular) utilizado para situaciones en las que el idioma es desconocido y se necesita un orden predeterminado simple. Probablemente corresponda al orden de puntos de código Unicode, que seguramente no es lo que quieres si estás almacenando sueco.

1

Proporcionar los datos existentes en la base de datos codificados CORRECTAMENTE en latin1, convertir las tablas a utf8 (utilizando ALTER TABLE, como se describe en los documentos) debería funcionar.

Entonces todo su aplicación tiene que hacer es continuar haciendo lo que hacía antes. Si su aplicación desea usar caracteres Unicode, debe establecer su codificación de conexión a utf8 y usar utf8, pero ese es su problema.


El problema es que un gran número de aplicaciones web de dados históricamente han enviado datos a MySQL y utf8 dicho que tratarlo como latin1. MySQL honrará esto perfectamente y guardará basura en las tablas, según las instrucciones.

la conversión de las tablas de latin1 a UTF-8 no va a reparar este error, ya que realmente tienen en total basura allí. Repararlos no es trivial, especialmente si durante la vida útil de la aplicación se han estado hablando diferentes tipos de basura a la base de datos.

+0

Bueno, los datos proviene de una aplicación Rails que tiene la codificación de caracteres a utf-8, no latin1. Presumiblemente, esto coloca a mi aplicación en la categoría de 'aplicación web basura' que está enviando utf-8 a una tabla latin1. ¿Qué sugieres que haga para convertir los datos? – Olly

+0

Esta respuesta confunde la intercalación con la codificación de caracteres – mattmanser

0

uso por debajo de consulta MySQL para convertir su columna:

ALTER TABLE users MODIFY description VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

Para ver los detalles completos sobre su mesa:

SHOW FULL COLUMNS FROM users; 
Cuestiones relacionadas