2

もともとlatin1エンコーディングとlatin1_swedish_ci照合で作成された大規模なデータベースがあります。

SET NAMES UTF8多くの変更を加えましたが、現在はクエリの前に使用するDoctrine2を使用しています。以前はUTF-8を使用するように設定されたYiiフレームワークを使用していました。基本的に、最初はこれらすべてを見落としていましたが、私が理解していることから、UTF-8データをデータベースに書き込んでいますが、すべてlatin1であると想定されています。

データベースをutf-8に変換したいのですが、安全に変換してデータが失われないようにする方法がわかりません。

2つの質問:

  1. これを正しく行ったことを確認する方法はありますか?2 GBのデータがあるので、スキャンしてテストすることはできませんが、データベースがUTF-8をすでに使用しているかどうかを判断するために検索できる特定の文字はありますか?

  2. すべてを変換する適切な方法は何ですか?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に変更すると、機能します。ダンプして再作成するのではなく、単に変更する方がいいのですが、これに基づく他の提案やアイデアがない場合は、それに頼ります。

4

2 に答える 2

2

物事をチェックするには、次のようなことができます。

SELECT t1.*
FROM table_1 t1 
JOIN table_1 t2 on t1.guid = t2.guid AND
t1.field_1 <> t2.field_1 COLLATE UTF-8

基本的に、その場で、列の照合を変更し、問題が発生する可能性があるかどうかを確認します。

すべてが正常に変換されると仮定すると、すべてを再インポートする必要はありませんALTER TABLE。新しいエンコーディングで問題ないはずです。

于 2012-04-19T05:16:34.997 に答える
1

ダンプと再インポートで動作するようになりました。私は主にこのガイドに従いました:http://en.gentoo-wiki.com/wiki/Convert_latin1_to_UTF-8_in_MySQL

他の誰かが私の状況にある場合(UTF-8データがlatin1データベースに保存されており、常に呼び出してアクセスしている場合はSET NAMES utf8、次のことを試すことができます(上記のソースからの私の変更)。

mysqldump -h example.org --user=foo -p -c --insert-ignore --skip-set-charset -r dump.sql dbname

UTF-8であることを再確認してください(私の場合)

file dump.sql

ダンプで変換を行います

perl -pi -w -e 's/CHARSET=latin1/CHARSET=utf8/g;' dump.sql

新しいデータベースを作成します(念のため古いデータベースを削除しませんでした)

mysql --user=foo -p --execute="CREATE DATABASE dbnameutf8 CHARACTER SET utf8 COLLATE utf8_general_ci;"

輸入

mysql --user=foo -p --default-character-set=utf8 dbnameutf8 < dump.sql

それが他の誰かを助けることができることを願っています。覚えておいてください、ALTER TABLE...それはうまくいかないかもしれません(私の場合はうまくいきませんでした)。

于 2012-04-20T03:45:12.587 に答える