mysql2 gem 0.3.15给出ASCII-8BIT,编码设置为“utf8”

时间:2014-03-28 17:42:03

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

我正在使用MySQL 5.1.71和Rails 4.0.4在Ruby 2.0.0-p353上运行(通过rbenv + ruby​​-build),使用mysql2 gem 0.3.15。 CentOS 6.5。

在database.yml中,编码设置为" utf8"和适配器是" mysql2"适用于所有环境。

我的桌子都使用UTF-8," DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci"。

在Ruby中,Encoding::default_internal == Encoding::default_external == Encoding::UTF_8

关于ActiveRecord为什么还能给我ASCII-8BIT字符串的原因我还能看到什么?我在Mac上开发了UTF-8,但在Linux上生产的是ASCII-8BIT。

当我启动一个控制台并直接使用mysql2时,我得到了ASCII,所以这似乎就是问题所在。

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

SHOW CREATE TABLE产品:

CREATE TABLE `product` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varbinary(255) DEFAULT NULL,
  `price` decimal(12,2) DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  `category` varbinary(255) DEFAULT NULL,
  `quantity` int(11) NOT NULL,
  `package_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `index_product_on_package_id` (`package_id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

2 个答案:

答案 0 :(得分:1)

请记住,MySQL的“ utf8”编码并不是真正的utf8。您需要使用utf8mb4。

有关更多详细信息,请参见:https://medium.com/@adamhooper/in-mysql-never-use-utf8-use-utf8mb4-11761243e434

答案 1 :(得分:0)

首先检查所有服务器的my.cnf排序规则。你应该有类似的东西:

[mysqld]
init_connect=‘SET collation_connection = utf8_unicode_ci’
character-set-server = utf8
collation-server = utf8_unicode_ci

[client]
default-character-set = utf8

第二次检查Rails中客户端的排序规则:

ActiveRecord::Base.connection.collation
相关问题