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

UTF-8文字の問題。私が見るものは私が保存したものではありません

    この問題は、このサイトの参加者や他の多くの人々を悩ませています。

    CHARACTER SETの5つの主なケースをリストしました トラブル。

    ベストプラクティス

    今後は、CHARACTER SET utf8mb4を使用するのが最適です。 およびCOLLATION utf8mb4_unicode_520_ci 。 (パイプラインには新しいバージョンのUnicode照合があります。)

    utf8mb4 utf8のスーパーセットです 絵文字や一部の中国語で必要な4バイトのutf8コードを処理するという点で。

    MySQL以外では、「UTF-8」はすべてのサイズのエンコーディングを指します。したがって、MySQLのutf8mb4と実質的に同じです。 、utf8ではありません 。

    以下では、これらのスペルと大文字を使用して、MySQLの内部と外部を区別しようとします。

    すべきことの概要 行う

    • エディタなどをUTF-8に設定します。
    • HTMLフォームは<form accept-charset="UTF-8">のように開始する必要があります 。
    • バイトをUTF-8としてエンコードします。
    • クライアントで使用されているエンコーディングとしてUTF-8を確立します。
    • 列/テーブルでCHARACTER SET utf8mb4を宣言します (SHOW CREATE TABLEで確認してください 。)
    • <meta charset=UTF-8> HTMLの先頭に
    • 保存されたルーチンは、現在の文字セット/照合を取得します。再構築が必要な場合があります。

    UTF- 8ずっと

    コンピューター言語の詳細 (およびその後続のセクション)

    データをテストする

    ツールまたはSELECTを使用してデータを表示する そのようなクライアント、特にブラウザが多すぎると、誤ったエンコーディングを補正し、データベースが破損している場合でも正しいテキストを表示しようとします。したがって、英語以外のテキストを含むテーブルと列を選択して、実行してください

    >
    SELECT col, HEX(col) FROM tbl WHERE ...
    

    正しく保存されたUTF-8のHEXは

    になります
    • 空白の場合(任意の言語):20
    • 英語の場合:4x5x6x 、または7x
    • ほとんどの西ヨーロッパでは、アクセント付きの文字はCxyyである必要があります
    • キリル文字、ヘブライ語、ペルシア語/アラビア語:Dxyy
    • ほとんどのアジア:Exyyzz
    • 絵文字と一部の中国語:F0yyzzww
    • 詳細

    発生した問題の具体的な原因と修正

    切り捨て テキスト(Se Señorの場合 ):

    • 保存されるバイトはutf8mb4としてエンコードされません。これを修正してください。
    • また、読み取り中の接続がUTF-8であることを確認してください。

    ブラックダイヤモンド 疑問符付き(Se�or Señorの場合 );これらのケースの1つが存在します:

    ケース1(元のバイトはではなかった UTF-8):

    • 保存されるバイトはutf8としてエンコードされません。これを修正してください。
    • 接続(またはSET NAMESINSERTの場合 および SELECT utf8/utf8mb4ではありませんでした。これを修正してください。
    • また、データベースの列がCHARACTER SET utf8であることを確認してください (またはutf8mb4)。

    ケース2(元のバイトは UTF-8):

    • 接続(またはSET NAMESSELECTの場合 utf8/utf8mb4ではありませんでした。これを修正してください。
    • また、データベースの列がCHARACTER SET utf8であることを確認してください (またはutf8mb4)。

    黒のひし形は、ブラウザが<meta charset=UTF-8>に設定されている場合にのみ発生します 。

    質問マーク (ブラックダイヤモンドではなく、通常のもの)(Se?or Señorの場合 ):

    • 格納されるバイトはutf8/utf8mb4としてエンコードされていません。これを修正してください。
    • データベースの列がCHARACTER SET utf8ではありません (またはutf8mb4)。これを修正します。 (SHOW CREATE TABLEを使用します 。)
    • また、読み取り中の接続がUTF-8であることを確認してください。

    文字化けSeñor Señorの場合 ):(この説明はダブルエンコーディングにも適用されます 、必ずしも表示されるとは限りません。)

    • 保存するバイトはUTF-8でエンコードする必要があります。これを修正してください。
    • INSERTing時の接続 およびSELECTing テキストはutf8またはutf8mb4を指定する必要があります。これを修正してください。
    • 列はCHARACTER SET utf8として宣言する必要があります (またはutf8mb4)。これを修正してください。
    • HTMLは<meta charset=UTF-8>で始まる必要があります 。

    データは正しいように見えても正しく並べ替えられない場合は、間違った照合を選択したか、ニーズに合った照合がないか、ダブルエンコーディングを使用しています。 。

    ダブルエンコーディング SELECT .. HEX ..を実行することで確認できます 上記。

    é should come back C3A9, but instead shows C383C2A9
    The Emoji 👽 should come back F09F91BD, but comes back C3B0C5B8E28098C2BD
    

    つまり、16進数は本来の約2倍の長さです。これは、latin1(またはその他)からutf8に変換し、それらのバイトをlatin1であるかのように扱い、変換を繰り返すことによって発生します。並べ替え(および比較)は行われません。たとえば、文字列がSeñorであるかのように並べ替えているため、正しく機能します。 。

    可能な場合はデータを修正する

    切り捨ての場合 および質問マーク 、データが失われます。

    文字化けの場合 /ダブルエンコーディング 、...

    ブラックダイヤモンドの場合 、...

    修正 ここにリストされています。 (5つの異なる状況に対する5つの異なる修正。慎重に選択してください): http://mysql。 rjweb.org/doc.php/charcoll#fixes_for_various_cases



    1. Postgresを開始できません

    2. psycopg2は実際にはデータを挿入していません

    3. PostgreSQLのLISTAGG(Oracleデータベース)に相当するものは何ですか?

    4. Oracle Live SQL