2010-12-08 4 views
1

開発データベースに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 

答えて

1

それがより良いサポートされているように私は、あなたがこれらの日mysql2の宝石を使用する必要がありますかなり確信している:ここで

はrakeタスクの一例です。これはとにかく新しいRailsアプリケーションのデフォルトです。

エンコードの問題を解決する上で、PHPアプリケーションがUTF-8に対処できない理由はありますか?そうでない場合には、最も簡単な方法は、この資料の手順に従うことになります:

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

私は迅速なGoogle検索でこれを見つけました。これはうまくいくかもしれませんが、保証はできませんので、まずバックアップを行い、いくつかのテストを実行することをお勧めします。

+0

ありがとうございます!私は "mysql2"宝石に切り替えました。そして今、インポートとレンダリングの両方が完璧に動作します! (つまり、Unicodeはデータベースとウェブページの両方に正しく表示されます)。私はこれが新しい標準であることを知らなかった - 私は通常のsqlite Railsアプリケーションを作成し、MySQL接続情報を追加した。 – hatkirby

関連する問題