Не могу хранить UTF-8 в RDS, несмотря на настройку новой группы параметров, используя рельсы на Heroku
-
25-09-2019 - |
Вопрос
Я устанавливаю новый экземпляр приложения 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 и не включает никаких настроек кодирования или коалиции. При этом взломая его, правильные настройки всегда объединяются до выполнения соединения с базой данных.