У меня есть приложение Rails (Rails 3.0.1, Ruby 1.9.2), которое использует MySQL в качестве своей базы данных разработки.База данных настроена на использование параметров сортировки utf8_unicode_ci, а также всех полей.У меня также есть устаревшее PHP-приложение, которое это приложение Rails должно заменить после завершения.Приложение PHP также использует MySQL, но все поля используют "latin1_sweedish_ci".Я написал задачи Rake, которые используют MySQL API и ActiveRecord для импорта данных из старой базы данных в новую, которая, кажется, идет хорошо, пока не встретит символы Unicode в исходной базе данных.При использовании гема «mysql», после запуска грабли и попытки загрузить страницу с символами Юникода, я получаю следующую ошибку:
incompatible character encodings: ASCII-8BIT and UTF-8
Переключение на 'ruby-mysql 'gem и перезапуск сервера, однако, решают проблему, и символы Unicode отображаются правильно.Однако, это работает только в этой комбинации, потому что, когда я импортирую данные, используя гем 'ruby-mysql', страница отображается, но весь Юникод испорчен и заменен символами мусора-y.
Чтоя могу сделать это, чтобы исправить это, или, по крайней мере, иметь возможность импортировать мои данные и отображать их без изменения исходного кода?Я использую сервер MySQL 5.1.53 из MacPorts на OS X Snow Leopard.Я скомпилировал оба гема «mysql» и «ruby-mysql» как 64-битные, хотя я загружаю OS X с «arch = i386», так что, возможно, в этом нет необходимости.
Вотпример грабли:
desc "Imports posts from legacy app"
task :posts => :environment do
my = Mysql.connect("localhost", "importer", "*password removed*", "publicweb", nil, "/opt/local/var/run/mysql5/mysqld.sock")
res = my.query("SELECT * FROM updates")
res.each do |row|
post = Post.new
post.title = Legacy.strip_slashes row[1]
post.body = Legacy.resolve_bbcode row[3], true
post.published_at = Time.parse(row[4])
post.author = User.where(:login => row[2]).first
post.old_id = row[0]
post.old_slug = row[5]
post.state = "published"
post.save!
end
puts "Imported #{res.num_rows} posts"
end