Ruby и MySQL символы UTF-8

Я переключаю приложение Sinatra с SQLite3 на MySQL. По какой-то непонятной мне причине, когда я извлекаю данные из MySQL с помощью Ruby и Sequel, символы отображаются в 8-битном формате ASCII вместо UTF-8.

Среда развертывания — FreeBSD 9.1 и MySQL 5.6.12 с общесистемным ruby19, установленным из портов FreeBSD. Однако RVM ruby-2.0p247 дает тот же результат.

Мой my.cnf следующий:

# The following options will be passed to all MySQL clients
[client]
default-character-set=utf8
#password = your_password
port    = 3306
socket    = /tmp/mysql.sock
# Here follows entries for some specific programs

# The MySQL server
[mysqld]
port    = 3306
socket    = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 128M 
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 2M
myisam_sort_buffer_size = 32M
thread_cache_size = 4
query_cache_size= 8M 
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 2

# encoding issues
character-set-server=utf8
collation-server=utf8_general_ci

log-bin=mysql-bin
binlog_format=mixed
server-id = 1
[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash
safe-updates

[myisamchk]
key_buffer_size = 64M
sort_buffer_size = 64M
read_buffer = 1M
write_buffer = 1M

[mysqlhotcopy]
interactive-timeout

Все мои файлы используют строку shebang вместе с кодировкой UTF-8, как этот скрипт, который я использую для проверки записей:

#!/usr/bin/env ruby
# encoding: UTF-8

require 'sequel'

msql = Sequel.connect(adapter: 'mysql', host: 'localhost', database: 'metrosignage', user: 'atma', password: 'toola697', encoding: 'utf8')

b = msql[:drama_addressbook]
b.each do |entry|
  p entry
  # p entry[:city].force_encoding("utf-8")
end

Если я использую entry[:city].force_encoding("utf-8"), вывод правильный, греческие символы UTF-8 отображаются нормально. Однако я не понимаю, почему я не могу напрямую извлечь UTF-8.

Таблица, которую я читаю, создается с использованием следующего SQL:

CREATE TABLE `drama_addressbook` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `address` varchar(255) DEFAULT NULL,
  `address_no` int(11) DEFAULT NULL,
  `address_description` varchar(255) DEFAULT NULL,
  `phone` varchar(255) DEFAULT NULL,
  `city` varchar(255) DEFAULT NULL,
  `country` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8;

Итак, база данных — UTF-8, а данные — UTF-8. Мои вопросы:

  • Я делаю что-то неправильно?
  • Зачем Руби нужен force_encoding?

person patm    schedule 09.07.2013    source источник
comment
Вы создали БД, как это? CREATE DATABASE metrosignage DEFAULT CHARSET utf8;   -  person Patrick Oscity    schedule 10.07.2013


Ответы (1)


Попробуйте использовать адаптер mysql2 вместо адаптера mysql, так как я считаю, что драйвер mysql2 обрабатывает кодировки, а драйвер mysql — нет.

person Jeremy Evans    schedule 10.07.2013
comment
Спасибо, это сработало! Не верится, что адаптер по умолчанию не поддерживает UTF-8, но все равно :-) большое спасибо! - person patm; 10.07.2013
comment
Я использую сам mysql2, но у меня возникла проблема. Ниже приведен код, который я использовал: Sequel.mysql2('some_db', :user => 'user', :password => 'password', :host => 'localhost', :encoding => 'utf8', :loggers => [logger]) - person Jikku Jose; 15.10.2014