mysql2 gem 0.3.15 提供编码设置为“utf8”的 ASCII-8BIT

Posted

技术标签:

【中文标题】mysql2 gem 0.3.15 提供编码设置为“utf8”的 ASCII-8BIT【英文标题】:mysql2 gem 0.3.15 gives ASCII-8BIT with encoding set to "utf8" 【发布时间】:2014-05-08 07:47:00 【问题描述】:

我正在使用 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)

显示创建表产品:

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

【问题讨论】:

mysql2 0.3.15 was released on January 23, 2014,差不多 2 年前。您是否尝试过最新版本(目前为0.4.2)? 您好,我遇到了同样的问题,想知道您是否已解决此问题或找到合适的解决方法? mysql2 为 JSON 序列化属性等二进制数据返回 ASCII-8BIT。 【参考方案1】:

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

更多详情见:https://medium.com/@adamhooper/in-mysql-never-use-utf8-use-utf8mb4-11761243e434

【讨论】:

【参考方案2】:

首先检查所有服务器的 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

【讨论】:

以上是关于mysql2 gem 0.3.15 提供编码设置为“utf8”的 ASCII-8BIT的主要内容,如果未能解决你的问题,请参考以下文章

Gem::LoadError 为数据库适配器指定了 'mysql2',但是 gem 没有加载

无法为 Rails 项目安装 mysql2 gem

mysql2 gem 为错误的 mysql 客户端库编译

为错误的mysql客户端库版本编译的Ruby mysql2 gem

安装 mysql2 gem 错误

错误:安装 mysql2 时出错:错误:无法在 AWS Linux 上构建 gem 原生扩展