2008-12-06 27 views
17

Tengo un sitio de preparación de Rails que se ejecuta en MySQL 5.0.32-Debian.UTF8 Problemas de MySQL en Rails: problemas de codificación con utf8_general_ci

En este sitio en particular, todas mis tablas están utilizando la codificación utf8/utf8_general_ci.

Dentro de esa base de datos, tengo algunos datos que se ve así:

mysql> select * from currency_types limit 1,10; 
+------+-----------------+---------+ 
| code | name   | symbol | 
+------+-----------------+---------+ 
| CAD | Canadian Dollar | $  | 
| CNY | Chinese Yuan | å…ƒ  | 
| EUR | Euro   | €  | 
| GBP | Pound   | £  | 
| INR | Indian Rupees | ₨  | 
| JPY | Yen    | ¥  | 
| MXN | Mexican Peso | $  | 
| USD | US Dollar  | $  | 
| PHP | Philippine Peso | ₱  | 
| DKK | Denmark Kroner | kr  | 
+------+-----------------+---------+ 

Aquí está el problema que estoy teniendo

En puesta en escena (con el PP y el sitio de rieles que se ejecuta en el debian cuadro), los caracteres de los símbolos aparecen correctamente cuando se muestran desde los rieles. Por ejemplo, el Yuan chino aparece como 元 en mi navegador, no å ... ƒ como se ve dentro de la base de datos.

Cuando descargo esos datos a mi máquina de desarrollo local OS X y ejecuto localmente el DB y los Rails, veo la representación desde el DB (å ... ƒ) en mi navegador, no el carácter 元 como veo en la puesta en escena .

depuración que he hecho

He aseguró que todos los encabezados de Content-Type están regresando como UTF-8 de cada servidor web (local, puesta en escena).

Mi servidor mysql local y el servidor de transferencia están configurados para usar utf8 como el juego de caracteres predeterminado. Estoy usando "nombres de conjunto 'utf8'" antes de hacer cualquier llamada.

Incluso puedo conectarme a mi base de almacenamiento por defecto desde mi host OS X Rails, y todavía veo los caracteres å ... ƒ que representan el yuan. Supongo que entonces, tal vez haya un problema con mi cliente local de MySQL, pero no puedo entender cuál es el problema.

Tal vez esto podría dar una idea

para que sea aún más confuso, si me pega el carácter 元 en el db en mi máquina local, veo que en la multa navegador web. --- AUN SI PEGO EL MISMO CARACTER EN MI DB DE ESCENOGRAFIA, OBTENGO UN? marca en su lugar en la página de mi sitio de Rails de ensayo.

Además, localmente en mi máquina de raíles OS X si utilizo "set names 'latin1'" antes de mis consultas, todos los caracteres vuelven correctamente. Ya tenía estas tablas configuradas como latin1 antes: ¿podría ser este el problema?

Alguien ayúdeme por favor aquí, me estoy volviendo loca tratando de descubrir qué pasa!

Respuesta

28

AHA! Parece que antes tenía cierta información de tabla codificada en latin1 y estúpidamente cambió las bases de datos a utf8 sin convertir.

la ejecución del siguiente tabla fijo que currency_types:

mysqldump -u root -p --opt --default-character-set=latin1 --skip-set-charset DBNAME > DBNAME.sql 

mysql -u root -p --default-character-set=utf8 DBNAME < DBNAME.sql 

Ahora sólo tengo que asegurar que el otro contenido generado después de la latin1> interruptor de UTF-8 no está en mal estado por el que :(

+0

Sí, ese es el problema. pero cuando estableces tu conexión a latin1 parece normal porque hace la misma traducción. Tuve este problema pero no pude volver a crear la base de datos.Así que cambié phpMyAdmin para usar una conexión latin1, luego exporté (por lo que los datos exportados ahora eran correctos), luego eliminé ese hack y reimporté. Datos corregidos. Detalles aquí: http://omegadelta.net/2010/11/23/when-you-thought-the-db-was-utf-8-but-it-wasnt/ –

+0

¡Gracias! ¡Estaba rascándome la cabeza bastante esta mañana y esta resultó ser la solución para una base de datos creada antes de mi tiempo! – Cymen

+0

El usuario de Windows que solo recibe mensajes de 'acceso denegado', debe cambiar ** DBNAME.sql ** a **% homepath% \ DBNAME.sql ** para las llamadas mysqldump y mysql. ¡Y gracias a Subimage! –

2
  1. El problema podría haber sido con usted cliente de MySQL en la etapa de que no es compatible con UTF-8.
  2. Su configuración de instalación de ruby ​​OSX local podría no haber declarado las configuraciones adecuadas. Debería tener "encoding: utf8" en "config/database.yml" para la base de datos MySQL. Debería tener "$ KCODE = 'u'" en "config/environment.rb" para el entorno Ruby.
+0

No tengo la parte $ KCODE, pero tengo "codificación: utf8" en todos los archivos de configuración. Parece que mi problema era que tenía contenido con codificación mixta dentro de la base de datos. Así que estaba almacenando caracteres latin-1, pero tratando de leerlos como utf8 – Subimage

+0

vi tu respuesta después de publicar esto ... De todos modos, gracias por señalar este error. He visto este error en muchos casos – yrcjaya

+0

Agregando la línea de codificación a database.yml resolvió mi problema. –

19

¿Tiene estas dos líneas en su database.yml en la sección correcta?

encoding: utf8 
collation: utf8_general_ci 
+0

no sabía que el archivo yml podría tener una línea de intercalación, pero sí tengo la codificación ... – Subimage

+0

salvó mi día :) – amjad

+4

'utf8_unicode_ci' se recomienda – NARKOZ

1

Otro enfoque simple es fijar el tipo de codificación mediante el uso de SQL instrucción ALTER. Puedes hacer esto usando el script bash a continuación.

for t in $(mysql --user=root --password=admin --database=DBNAME -e "show tables";);do echo "Altering" $t;mysql --user=root --password=admin --database=DBNAME -e "ALTER TABLE $t CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;";done 

prettified

for t in $(mysql --user=root --password=admin --database=DBNAME -e "show tables";); 
    do 
     echo "Altering" $t; 
     mysql --user=root --password=admin --database=DBNAME -e "ALTER TABLE $t CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;"; 
    done 
0

Mi DB ya estaba configurado por defecto para UTF-8, pero me encontré con el mismo problema.

También después de la adición de la siguiente etiqueta meta de costumbre, el problema todavía estaba allí:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

Entonces creó un dedicado connection.php para asegurar todas las comunicaciones con MySQL se ha establecido a charset UTF-8. Tenga en cuenta que no hay - en utf8 en mysqli_set_charset($bd, 'utf8')!

Aquí es mi Connection.php:

<?php 
    $mysql_hostname = "localhost"; 
    $mysql_user = "username"; 
    $mysql_password = "password"; 
    $mysql_database = "dbname"; 
    $prefix = ""; 
    $bd = mysqli_connect($mysql_hostname, $mysql_user, $mysql_password) or die("Could not connect database"); 
    mysqli_select_db($bd, $mysql_database) or die("Could not select database"); 
    if(!mysqli_set_charset($bd, 'utf8')) { 
     exit() ; 
    } 
?> 

Otro archivo PHP:

<?php 
    //Include database connection details 
    require_once('connection.php'); 

    //Enter code here... 

    //Create query 
    $qry = "SELECT * FROM subject"; 
    $result = mysqli_query($bd, $qry); 
?> 

//Other stuff 
0

para los carriles ejecute el siguiente fragmento de código en la consola rieles. Generará un sql para todas las tablas. Luego inicie sesión en mysql y ejecute sql copiado desde la consola de rieles. Modificará todas las tablas de codificación.

schema = File.open('db/schema.rb', 'r').read 
rows = schema.split("\n") 

table_name = nil 
rows.each do |row| 
    if row =~ /create_table/ 
    table_name = row.match(/create_table "(.+)"/)[1] 
    puts "ALTER TABLE `#{table_name}` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;" 
    end 
end 
+0

Esta no es la forma de Rails, intente usar migraciones en su lugar. – mauriciomdea

0

Puede generar una migración, la forma en rieles, para cambiar el tipo de intercalación en sus bases de datos:

rails generate migration ChangeDatabaseCollation 

A continuación, puede editar el archivo generado y pegar:

def change 
    # for each table that will store the new collation execute: 
    execute "ALTER TABLE my_table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci" 
end 

Y ejecute la migración:

rake db:migrate 

También puede hacer cumplir la nueva intercalación en su database.yml:

development: 
    adapter: mysql2 
    encoding: utf8 
    collation: utf8_general_ci 

Para obtener más información sobre las migraciones Rieles:

http://edgeguides.rubyonrails.org/active_record_migrations.html

Para obtener más información sobre los tipos de intercalación:

http://collation-charts.org/

Cuestiones relacionadas