もともとlatin1エンコーディングとlatin1_swedish_ci照合で作成された大規模なデータベースがあります。
SET NAMES UTF8
多くの変更を加えましたが、現在はクエリの前に使用するDoctrine2を使用しています。以前はUTF-8を使用するように設定されたYiiフレームワークを使用していました。基本的に、最初はこれらすべてを見落としていましたが、私が理解していることから、UTF-8データをデータベースに書き込んでいますが、すべてlatin1であると想定されています。
データベースをutf-8に変換したいのですが、安全に変換してデータが失われないようにする方法がわかりません。
2つの質問:
これを正しく行ったことを確認する方法はありますか?2 GBのデータがあるので、スキャンしてテストすることはできませんが、データベースがUTF-8をすでに使用しているかどうかを判断するために検索できる特定の文字はありますか?
すべてを変換する適切な方法は何ですか?mysqldumpして再インポートする必要があると言う人がいます(特定のフラグを使用して、http: //blog.makezine.com/2007/05/08/mysql-database-migration-latin/およびhttp:// docs .moodle.org / 22 / en / Converting_your_MySQL_database_to_UTF8)。他の人はあなたが列ごとにできると言います
ALTER TABLE...
(http://www.bothernomore.com/2008/12/16/character-encoding-hell/)。SET utf8
そして、私は私の考えの一部のようないくつかのコマンドを見てきましALTER TABLE
たが、それが機能するかどうかはわかりません。
編集:
データをダンプして、アクセント付きの文字をいくつか見つけました。これは、データ自体がUTF-8であることを示していますか?もしそうなら、私はブロブに「変換」して安全に戻すことができるので、ここでの手順が適用されると思いますhttp://codex.wordpress.org/Converting_Database_Character_Sets
もう一度編集:
前のリンクで読んだことを実行した後、データを比較すると、最初の非ASCII(?)文字の後にすべての文字が欠落していることがわかりました。そのため、タイトルを一重引用符で囲んで設定しました。新しいデータベースには、その文字とそれ以降のすべての文字がありませんでした。例として、これが私が実行していたコードです:
ALTER TABLE articles CHANGE title title VARBINARY(255) NOT NULL;
ALTER TABLE articles CHANGE title title VARCHAR(255) CHARACTER SET utf8 NOT NULL;
どういうわけかそれは私がデータを失う原因になりました。
しかし、ダンプして、各テーブルの文字セットをlatin1からutf8に変更すると、機能します。ダンプして再作成するのではなく、単に変更する方がいいのですが、これに基づく他の提案やアイデアがない場合は、それに頼ります。