mysql ruby-on-rails unicode encoding utf-8

Problemas UTF8 MySQL en Rails: problemas de codificación con utf8_general_ci



ruby-on-rails unicode (7)

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.

Al ejecutar lo siguiente se corrigió esa tabla 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 solo tengo que asegurarme de que el otro contenido generado después del interruptor latin1> utf8 no se arruine por eso :(

Tengo un sitio de preparación de Rails que se ejecuta en MySQL 5.0.32-Debian.

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

Dentro de esa base de datos, tengo algunos datos que se ven 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 la etapa (con el sitio db y Rails ejecutándose en el cuadro Debian), los caracteres de los símbolos aparecen correctamente desde Rails. 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 local de desarrollo OS X y ejecuto el DB y los Rails localmente, veo la representación desde el DB (å ... ƒ) en mi navegador, no el carácter 元 como veo en la puesta en escena.

Depuración que hice

Me he asegurado de que todos los encabezados para Content-Type regresen como utf8 de cada servidor web (local, por etapas).

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.

Quizás esto podría dar una pista

Para hacerlo aún más confuso, si pego el carácter 元 en la base de datos en mi máquina local, lo veo bien en el 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 por favor ayúdame aquí, me estoy volviendo loco tratando de descubrir qué pasa!


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

encoding: utf8 collation: utf8_general_ci


  1. El problema podría haber sido con usted, el cliente de MySQL en la puesta en escena, no es compatible con UTF-8.
  2. Es posible que su configuración de instalación de ruby ​​OSX local no haya 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 de Ruby.

Otro enfoque simple es establecer el tipo de codificación mediante el uso de la declaración SQL 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

embellecido

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


Mi DB ya estaba configurado por defecto a utf8, pero me encontré con el mismo problema.

Además, después de agregar la siguiente metaetiqueta habitual, el problema seguía allí:

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

Luego creé un connection.php dedicado para asegurar que todas las comunicaciones con MySQL estén configuradas en charset utf8. Tenga en cuenta que no hay - en utf8 en mysqli_set_charset($bd, ''utf8'') !

Aquí está 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


Para Rails, ejecute el siguiente fragmento de código en la consola de rails. 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


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

rails generate migration ChangeDatabaseCollation

Luego puede editar el archivo generado y pegarlo:

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 ejecuta la migración:

rake db:migrate

También puede aplicar 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 de Rails:

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

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

http://collation-charts.org/