開発データベースにMySQLを使用するRailsアプリケーション(Rails 3.0.1、Ruby 1.9.2)があります。データベースは、 "utf8_unicode_ci"照合とすべてのフィールドを使用するように設定されています。私はまた、このRailsアプリが完了すると置き換えられるように設定されている従来のPHPアプリを持っています。 PHPアプリケーションはMySQLも使用しますが、すべてのフィールドで「latin1_sweedish_ci」が使用されています。以前のデータベースから新しいデータベースにデータをインポートするために、MySQL APIとActiveRecordの両方を使用するRakeタスクを作成しました。これは、ソースデータベースでUnicode文字が見つかるまでうまくいくようです。 「mysqlの」宝石を使用する場合は、rakeタスクを実行し、その上にUnicode文字を使用してページをロードしようとした後、私は次のエラーを取得:PHPアプリケーションからRailsアプリケーションにインポートするときのUTF-8エンコーディングの問題
incompatible character encodings: ASCII-8BIT and UTF-8
「ルビー-mysqlの」宝石への切り替えをし、サーバーを再起動すると問題が解決され、Unicode文字が正しく表示されます。しかし、この組み合わせでのみ動作します。なぜなら、 'ruby-mysql'宝石を使用してデータをインポートすると、ページはレンダリングされますが、Unicodeのすべてが混乱してゴミy文字に置き換えられるからです。
これを修正するにはどうすればよいですか、あるいは少なくともデータをインポートしてソースコードを変更することなくレンダリングできるのですか?私はOS X Snow LeopardのMacPortsからMySQLサーバ5.1.53を実行しています。私は「mysql」と「ruby-mysql」の両方の宝石を64ビットとしてコンパイルしましたが、「arch = i386」でOS Xを起動するので、必要ないかもしれません。
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
ありがとうございます!私は "mysql2"宝石に切り替えました。そして今、インポートとレンダリングの両方が完璧に動作します! (つまり、Unicodeはデータベースとウェブページの両方に正しく表示されます)。私はこれが新しい標準であることを知らなかった - 私は通常のsqlite Railsアプリケーションを作成し、MySQL接続情報を追加した。 – hatkirby