Проблема с кодировкой UTF-8 при импорте из приложения PHP в приложение Rails - PullRequest
1 голос
/ 08 декабря 2010

У меня есть приложение 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

1 Ответ

1 голос
/ 08 декабря 2010

Я почти уверен, что в эти дни вы должны использовать гем mysql2, так как он лучше поддерживается. В любом случае это значение по умолчанию в новом приложении Rails.

С точки зрения решения проблемы кодирования, есть ли причина, по которой приложение PHP не может справиться с UTF-8? Если нет, то самое простое, что нужно сделать, это выполнить шаги, описанные в этой статье:

http://en.gentoo -wiki.com / вики / Convert_latin1_to_UTF-8_in_MySQL

Я нашел это с помощью быстрого поиска в Google. Это может сработать, но я определенно не могу этого гарантировать, поэтому я рекомендую сначала сделать резервную копию и выполнить несколько тестов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...