「ダブルエンコーディング」に悩まされています。
これが起こったことです。
- クライアントにはutf8としてエンコードされた文字がありました。および
-
SET NAMES latin1クライアントがlatin1エンコーディングを持っていると主張して嘘をついた。および -
CHARACTER SET utf8と宣言されたテーブルの列 。
e-acuteに何が起こるかを見ていきましょう:é 。
- utf8でのその16進数は2バイトです:
C3A9。 -
SET NAMES latin1latin1でエンコードされた2文字の文字として表示されましたÃおよび©(16進数:C3およびA9) - ターゲットは
CHARACTER SET utf8だったので 、これらの2文字を変換する必要がありました。Ãutf8(hexC383)に変換されました )および©(16進数のC2A9) - したがって、4バイトが格納されました(16進数の
C383C2A9)
それを読み戻すと、逆の手順が実行され、エンドユーザーはおそらく何も問題に気づきませんでした。何が問題なのですか:
- 保存されるデータは、本来の2倍の大きさです(アジア言語の場合は3倍)。
- 等しい、より大きいなどの比較は、期待どおりに機能しない場合があります。
-
ORDER BY期待どおりに機能しない可能性があります。
このようなものはあなたのデータを修復します:
UPDATE ... SET col = CONVERT(BINARY(CONVERT(
CONVERT(UNHEX(col) USING utf8)
USING latin1)) USING utf8);