sql >> データベース >  >> RDS >> Mysql

間違ったエンコーディングを挿入した後、MySQLデータベースのデータを更新する

    「ダブルエンコーディング」に悩まされています。

    これが起こったことです。

    • クライアントにはutf8としてエンコードされた文字がありました。および
    • SET NAMES latin1 クライアントがlatin1エンコーディングを持っていると主張して嘘をついた。および
    • CHARACTER SET utf8と宣言されたテーブルの列 。

    e-acuteに何が起こるかを見ていきましょう:é

    1. utf8でのその16進数は2バイトです:C3A9
    2. SET NAMES latin1 latin1でエンコードされた2文字の文字として表示されました Ã および© (16進数:C3 およびA9
    3. ターゲットはCHARACTER SET utf8だったので 、これらの2文字を変換する必要がありました。Ã utf8(hex C383)に変換されました )および© (16進数のC2A9
    4. したがって、4バイトが格納されました(16進数のC383C2A9

    それを読み戻すと、逆の手順が実行され、エンドユーザーはおそらく何も問題に気づきませんでした。何が問題なのですか:

    • 保存されるデータは、本来の2倍の大きさです(アジア言語の場合は3倍)。
    • 等しい、より大きいなどの比較は、期待どおりに機能しない場合があります。
    • ORDER BY 期待どおりに機能しない可能性があります。

    このようなものはあなたのデータを修復します:

    UPDATE ... SET col = CONVERT(BINARY(CONVERT(
                             CONVERT(UNHEX(col) USING utf8)
                             USING latin1)) USING utf8);
    

    詳細 および修正のその他の例




    1. 複数の値に一致するレコードのグループを検索します

    2. MYSQL UNION DISTINCT

    3. MySQLテーブル名の特殊文字

    4. brew install mysql on macOS