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

StackOverflow https://stackoverflow.com/questions/4609045

Вопрос

Я устанавливаю новый экземпляр приложения 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. После грабли БД: мигрировать, все выглядит хорошо:

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

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

Теперь я вхожу в комментарий через форму в приложении: «úbe® ƒåil», но в базе данных у меня есть «ãšbe® æ'ã ¥ Il»

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

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

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

Это было полезно?

Решение

Там проще проще. Вы можете указать кодировку в строке подключения DB. Отредактируйте надстройку 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.

Другие советы

В конечном итоге я решил мою проблему, добавив следующие в Rails :: INATIVER.RUN Блок в среде.

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 и не включает никаких настроек кодирования или коалиции. При этом взломая его, правильные настройки всегда объединяются до выполнения соединения с базой данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top