を使用するフィールドを持つMySQLテーブルがありますが、latin1_swedish_ci
そこにはUTF-8でエンコードされたデータがいくつかあります。
照合をからに変更するlatin1_swedish_ci
とutf8_general_ci
、ISO-8859-1のものは正常に変換されますが、UTF-8データが壊れて、次のようなものが表示されます。
何か案は?
編集: MySQL5.1でInnoDBを使用しています
を使用するフィールドを持つMySQLテーブルがありますが、latin1_swedish_ci
そこにはUTF-8でエンコードされたデータがいくつかあります。
照合をからに変更するlatin1_swedish_ci
とutf8_general_ci
、ISO-8859-1のものは正常に変換されますが、UTF-8データが壊れて、次のようなものが表示されます。
何か案は?
編集: MySQL5.1でInnoDBを使用しています
つまり、「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));