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

时间:2012-02-28 09:43:35

标签: mysql ruby-on-rails encoding utf-8

我已将每个编码集变量设置为utf8

database.yml

development: &development
  adapter: mysql2
  encoding: utf8

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

如果我在终端运行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 |
+----------------------+-----------------+

但这是打败空气。当我从utf8应用中插入Rails数据时,它最终会成为????????????。

我想念什么?

5 个答案:

答案 0 :(得分:15)

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

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

mysql app_db_production -u db_user -p   

或rails命令:

rails dbconsole production

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

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)

更改数据库归类和charset的命令:

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

请记住改变所有桌子的字符集和整理:

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 

现在应该可以了。

答案 1 :(得分:3)

我遇到了同样的问题。我将characterEncoding添加到mysql连接字符串的末尾:

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

答案 2 :(得分:1)

好的,对于@Ravbaker的答案没有削减它的其他任何人......更多提示

MySQL具有多个级别指定的编码:服务器,数据库,连接,表甚至字段/列。我的问题是,字段/列被迫拉丁(这超过了所有其他编码)。我将字段设置回表编码(这是utf-8),世界再次变好。

大多数设置都可以在通常的位置设置:my.cnf,alter queries和rails database.yml文件。

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

是我的诀窍。

对于服务器/连接编码,请使用my.cnf和database.yml 对于数据库/表/列编码,使用查询

(您也可以通过其他方式实现这些目标)

答案 3 :(得分:0)

你在HTML中有这个吗?

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

或带有<!doctype html>

的HTML5网页
<meta charset="utf-8">

您可能需要这个让浏览器在utf8中发送字符串。

答案 4 :(得分:0)

我今天有些问题!它是通过删除我的表并创建新的,然后db:migrate来解决的,所有这些都很有效! 警告:它将删除此表中的所有数据
所以:
$ 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
做得好!