2012-02-28 14 views
9

He establecido cada variable de conjunto de codificación que puedo deducir a utf8.Los raíles muestran signos de interrogación (????) para mis datos de entrada utf8

En database.yml:

development: &development 
    adapter: mysql2 
    encoding: utf8 

En my.cnf:

[client] 
default-character-set = utf8 

[mysqld] 
default-character-set = utf8 
skip-character-set-client-handshake 
character-set-server = utf8 
collation-server = utf8_general_ci 
init-connect = SET NAMES utf8 

Y si me quedo cliente mysql en el terminal:

mysql> show variables like 'character%'; 
+--------------------------+----------------------------+ 
| 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/ | 
+--------------------------+----------------------------+ 

mysql> show variables like 'collation%'; 
+----------------------+-----------------+ 
| Variable_name  | Value   | 
+----------------------+-----------------+ 
| collation_connection | utf8_general_ci | 
| collation_database | utf8_general_ci | 
| collation_server  | utf8_general_ci | 
+----------------------+-----------------+ 

Pero es batir el aire. Cuando inserto los datos utf8 de la aplicación Rails, finalmente se convierte en ????????????.

¿Qué extraño?

+0

Ver http://stackoverflow.com/questions/29805029/stored-non-english-characters-got-mysql-character-set-issue/29810725# 29810725 para una discusión de los signos de interrogación y cómo lidiar con ellos. –

Respuesta

15

Compruebe la configuración no global, pero cuando está conectado a una base de datos específica para la aplicación. Cuando cambiaste la configuración de mysql, también cambiaste la configuración de la base de datos de tu aplicación.

Una manera sencilla de comprobarlo es que entrar a MySQL en aplicación db:

mysql app_db_production -u db_user -p 

o rieles comando:

rails dbconsole production 

Para mi aplicación se ve así:

mysql> show variables like 'character%'; 
+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | utf8      | 
| character_set_connection | utf8      | 
| character_set_database | latin1      | 
| character_set_filesystem | binary      | 
| character_set_results | utf8      | 
| character_set_server  | utf8      | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 
8 rows in set (0.00 sec) 

mysql> show variables like 'collation%'; 
+----------------------+-------------------+ 
| Variable_name  | Value    | 
+----------------------+-------------------+ 
| collation_connection | utf8_general_ci | 
| collation_database | latin1_swedish_ci | 
| collation_server  | utf8_general_ci | 
+----------------------+-------------------+ 
3 rows in set (0.00 sec) 

Comando para cambiar la recopilación de bases de datos y el conjunto de caracteres:

mysql> alter database app_db_production CHARACTER SET utf8 COLLATE utf8_general_ci ; 
Query OK, 1 row affected (0.00 sec) 

Y remeber para cambiar juego de caracteres y la colación para todas sus tablas:

ALTER TABLE tablename CHARACTER SET utf8 COLLATE utf8_general_ci; # changes for new records 
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; # migrates old records 

Ahora debería funcionar.

+1

Puede que quiera usar utf_unicode_ci en lugar de utf_general_ci. http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci – mahemoff

+0

He creado un GIST que utilicé para generar el SQL para migrar mi la aplicación Rails que tenía este problema, aunque pequeña, está bellamente formada: https://gist.github.com/richhollis/7153490 –

0

¿Lo tiene en el HTML?

<meta http-equiv="content-type" content="text/html;charset=UTF-8" /> 

o en páginas HTML 5 con <!doctype html>

<meta charset="utf-8"> 

Usted puede necesitar esto para que el navegador envía cadenas en UTF-8.

+0

Probablemente es bueno tenerlo de todos modos, pero tenga en cuenta que no le servirá de mucho si los datos se almacenan como "????" en la base de datos ya –

0

¡Tengo algún problema hoy! Se resuelve soltando mi tabla y creando nuevas, luego db: migrate ¡y todo funciona bien!
Advertencia: se eliminarán todos los datos de este cuadro
Así:
$ mysql -u USER -p
mysql > drop database YOURDB_NAME_development;
mysql > create database YOURDB_NAME_development CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql > \q
$ rake db:migrate
Bien hecho!

+0

TABLE hereda de DATABASE. COLUMN hereda de TABLE. Entonces, si tiene el lujo de abandonar la base de datos, este código es simple y efectivo. –

1

Está bien para cualquier otra persona para quien la respuesta @Ravbaker no es suficiente .. algunos consejos más

MySQL tiene codificación especificada en múltiples niveles: servidor, base de datos, conexión, mesa e incluso campos/columnas. Mi problema era que el campo/columna estaba forzado a latín (lo que sobrepasa todas las demás codificaciones).Establecí el campo nuevamente en la codificación de la tabla (que era utf-8) y el mundo volvía a ser bueno.

La mayoría de estas configuraciones se pueden establecer en los lugares habituales: my.cnf, alter queries y rails database.yml file.

ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET utf8; 

fue la consulta que hizo el truco para mí.

Para codificaciones servidor/conexión utilicen my.cnf y database.yml Para la base de datos/tabla/uso codificaciones columna consultas

(También puede lograrla por otros medios)

+0

Tenga cuidado ... 'ALTER ... MODIFY' y' ALTER ... CONVERT TO' hacen cosas diferentes. Si el único texto que tiene es ascii, cualquiera lo hará. Si actualmente tiene bytes latin1 correctos en la columna, necesita 'CONVERT TO' para cambiar los bytes. –

3

que tenían el mismo problema . Añadí characterEncoding hasta el final de la cadena de conexión MySQL:

use this: jdbc:mysql://localhost/dbname?characterEncoding=utf8 
instead of this: jdbc:mysql://localhost/dbname 
Cuestiones relacionadas