Не удается сохранить UTF-8 в RDS, несмотря на настройку новой группы параметров с использованием Rails на Heroku - PullRequest
4 голосов
/ 05 января 2011

Я устанавливаю новый экземпляр приложения Rails (2.3.5) на Heroku, используя Amazon RDS в качестве базы данных. Я хотел бы использовать UTF-8 для всего. Поскольку RDS не является UTF-8 по умолчанию, я настроил новую группу параметров и переключил базу данных, чтобы использовать ее, в основном для этого . Кажется, сработало:

SHOW VARIABLES LIKE '%character%';

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       /rdsdbbin/mysql-5.1.50.R3/share/mysql/charsets/

Кроме того, я успешно настроил Heroku для использования базы данных RDS. После граблей db: migrate все выглядит хорошо:

CREATE TABLE `comments` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `commentable_id` int(11) DEFAULT NULL,
  `parent_id` int(11) DEFAULT NULL,
  `content` text COLLATE utf8_unicode_ci,
  `child_count` int(11) DEFAULT '0',
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `commentable_id` (`commentable_id`),
  KEY `index_comments_on_community_id` (`community_id`),
  KEY `parent_id` (`parent_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

В разметку я включил:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Также я установил:

production:
  encoding: utf8
  collation: utf8_general_ci

... в файле database.yml, хотя я не очень уверен, что в этом случае что-либо делается для соблюдения любых из этих настроек, поскольку Heroku, похоже, выполняет свою собственную настройку при подключении к RDS.

Теперь я ввожу комментарий через форму в приложении: «Úbe® ƒåiL», но в базе данных у меня есть «Ãšbe® Æ’Ã ¥ iL»

Выглядит хорошо, когда Rails загружает его обратно из базы данных, и он отображается на странице, поэтому, что бы он ни делал, он отменяет другой. Если я посмотрю на базу данных RDS в Sequel Pro, то все будет хорошо, если я установлю кодировку "UTF-8 Unicode via Latin 1". Так что, кажется, что где-то подкрадывается Latin-1.

Все работает в разработке, при подключении к локальной базе данных MySQL.

Кто-то должен был сделать это раньше, верно? Чего мне не хватает?

Ответы [ 2 ]

5 голосов
/ 31 декабря 2011

Есть более простой способ.Вы можете указать кодировку в строке подключения к БД.Отредактируйте надстройку RDS и добавьте ?encoding=utf8&collation=utf8_general_ci

У меня все получилось, изменений в проекте нет.

Например:

  mysql://user:pass@abc.rds.amazonaws.com/my-db?encoding=utf8&collation=utf8_general_ci

Ссылка: http://blog.arvidandersson.se/2011/09/27/setting-activerecord-connection-to-utf8-on-heroku

2 голосов
/ 07 января 2011

В конце концов, я решил свою проблему, добавив следующее в блок Rails :: Initializer.run в environment.rb

class Rails::Configuration
  def database_configuration
    # Heroku overwrites the database.yml file without setting any encoding when deploying to outside server (like Amazon RDS)      
    require 'erb'
    YAML::load(ERB.new(IO.read(database_configuration_file)).result).each_value {|env| env.merge!({"encoding" => "utf8", "collation" => "utf8_general_ci"}) }
  end
end

Heroku перезаписывает файл database.yml и не содержит кодировки илинастройки коалиции.Таким образом, путем хакерства правильные настройки всегда объединяются до установления соединения с базой данных.

...