0

を使用するフィールドを持つMySQLテーブルがありますが、latin1_swedish_ciそこにはUTF-8でエンコードされたデータがいくつかあります。

照合をからに変更するlatin1_swedish_ciutf8_general_ci、ISO-8859-1のものは正常に変換されますが、UTF-8データが壊れて、次のようなものが表示されます。

何か案は?

編集: MySQL5.1でInnoDBを使用しています

4

1 に答える 1

1

つまり、「latin1」列にはUTF-8でエンコードされたデータがありますが、すべてではありません。UTF-8で二重にエンコードされたデータがありますか?

これを行うと、二重にエンコードされた値を修正できます。最初にlatin1に変換し直し、文字列をバイナリとして再解釈し、バイナリ文字列が実際にはUTF-8でテキストエンコードされていることをMySQLに通知します。MySQLでは、これは次のように記述できます。

convert(binary convert(mycolumn using latin1) using utf8)

ここで問題となるのは、二重にエンコードされている文字列を検出して、それらだけを更新できるようにすることです。これは、文字単位の元の文字列の長さとバイト単位の新しい文字列の長さを比較することで実行できます。二重にエンコードされたテキストの場合、それらは等しくなければなりません。これが最終的な方法です。

update mytable set mycolumn = @str where char_length(mycolumn) = 
    length(@str := convert(binary convert(mycolumn using latin1) using utf8));
于 2012-08-01T16:43:19.440 に答える