0

私はmysqlデータベースを持っています(私のものではありません)。このデータベースでは、すべてのエンコーディングが utf-8 に設定されており、文字セット utf-8 で接続しています。しかし、データベースから読み取ろうとすると、次のようになります。

×¢×?ק 1
×'ית תו×'× ×” העוסק ×'מספר שפות ×ª×•×›× ×」
× × ×œ× ×œ×¤× ×•×ª ×חרי 12 ×'ליל×" ..

私が得るはずだったもの:

第1話
בית תוגנה העוסק במספר שפות תוכנה
נא לא לפנות אחרי 12 בלילה ..

phpmyadmin から見ると、同じことがわかります (pma の接続は utf-8 です)。データがヘブライ語であることはわかっています。誰かがこれらを修正する方法を知っていますか?

4

1 に答える 1

0

Windows-1252 として扱われ、その後 UTF-8 に変換された UTF-8 データがあるようです (「二重エンコード」と呼ばれることもあります)。

最初に決定する必要があるのは、変換が行われた段階 (データがテーブルに保存される前か、データを取得しようとしたときか) です。最も簡単な方法は、多くの場合、SELECT HEX(the_column) FROM the_table WHERE ...現在保存されているバイト エンコーディングを手動で検査することです。

  • 上記のデータの場合、C397C2A9...データが誤って格納されていることがわかります (データ挿入時の不適切な接続文字セットが最も一般的な原因です)。TEXT次のように修正できます (代わりに十分な長さのデータ型をBLOB適切に使用するように注意してください)。

    1. データ破損の原因となった Windows-1252 から UTF-8 への変換を元に戻します。

      ALTER TABLE the_table MODIFY the_column TEXT CHARACTER SET latin1;
      
    2. 誤ったエンコーディング メタデータを削除します。

      ALTER TABLE the_table MODIFY the_column BLOB;
      
    3. 修正されたエンコーディング メタデータを追加します。

      ALTER TABLE the_table MODIFY the_column TEXT CHARACTER SET utf8;
      

    sqlfiddleで参照してください。

    将来的にデータを正しく挿入するように注意してください。そうしないと、テーブルが部分的にある方法でエンコードされ、部分的に別の方法でエンコードされます (これを試して修正するのは悪夢になる可能性があります)。

    データベース スキーマを変更できない場合は、オンザフライでレコードを正しいエンコーディングにトランスコードできますCONVERT(BINARY CONVERT(the_column USING latin1) USING utf8)( sqlfiddleを参照)。データ。

  • ただし、表示される場合D7A2D73F...、データは正しく保存されており、データの取得時に破損が発生しています。正確な原因を特定するには、さらにテストを実行する必要があります。ガイダンスについては、UTF-8を最後まで参照してください。

于 2013-07-13T13:24:43.773 に答える