Rails为我输入的utf8数据显示问号(????)

Lai*_*uan 9 mysql encoding ruby-on-rails utf-8

我已经设置了我能想到的每个编码集变量utf8.

database.yml:

development: &development
  adapter: mysql2
  encoding: utf8
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

如果我在终端中运行mysql客户端:

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 |
+----------------------+-----------------+
Run Code Online (Sandbox Code Playgroud)

但这是打败空气.当我utf8Rails应用程序插入数据时,它最终变成了????????????.

我错过了什么?

Rav*_*ker 15

检查不是全局设置,但是当您连接到特定数据库以进行应用时.当您更改mysql的设置时,您还更改了应用数据库的设置.

检查它的简单方法是将mysql登录到app db:

mysql app_db_production -u db_user -p   
Run Code Online (Sandbox Code Playgroud)

或rails命令:

rails dbconsole production
Run Code Online (Sandbox Code Playgroud)

对于我的应用程序它看起来像这样:

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)
Run Code Online (Sandbox Code Playgroud)

用于更改数据库排序规则和字符集的命令:

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

并记得改变所有表的charset和collat​​ion:

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 
Run Code Online (Sandbox Code Playgroud)

现在它应该工作.