「ダブルエンコーディング」に悩まされています。
これが起こったことです。
- クライアントにはutf8としてエンコードされた文字がありました。および
-
SET NAMES latin1
クライアントがlatin1エンコーディングを持っていると主張して嘘をついた。および -
CHARACTER SET utf8
と宣言されたテーブルの列 。
e-acuteに何が起こるかを見ていきましょう:é
。
- utf8でのその16進数は2バイトです:
C3A9
。 -
SET NAMES latin1
latin1でエンコードされた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);