Mysql2 gem 0.3.15 дает ASCII-8BIT с кодировкой, установленной в "utf8"

Я использую 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? Я получаю UTF-8 на моем Mac в разработке, но ASCII-8BIT в производстве на Linux.

Когда я запускаю консоль и напрямую использую 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

Ответ 1

Прежде всего, проверьте настройку 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