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

UnicodeDecodeError:'ascii'コーデックは位置47のバイト0x92をデコードできません:序数が範囲内にありません(128)

    問題は、encodeを呼び出していることです strで オブジェクト。

    str はバイト文字列で、通常はUTF-8のような方法でエンコードされたテキストを表します。 encodeを呼び出すとき その上で、最初にテキストにデコードして戻す必要があるため、テキストを再エンコードできます。デフォルトでは、Pythonはs.decode(sys.getgetdefaultencoding())を呼び出すことでこれを行います。 、およびgetdefaultencoding() 通常、'ascii'を返します 。

    つまり、UTF-8でエンコードされたテキストを話し、ASCIIであるかのようにデコードしてから、UTF-8で再エンコードします。

    一般的な解決策は、decodeを明示的に呼び出すことです。 Pythonにデフォルトを使用させる代わりに、適切なエンコーディングを使用して、encodeします。 結果。

    しかし、適切なエンコーディングがすでに必要なものである場合、より簡単な解決策は、.decode('utf-8').encode('utf-8')をスキップすることです。 UTF-8 strを使用するだけです UTF-8 strとして すでにそうです。

    または、MySQLラッパーにエンコーディングを指定して、unicodeを取得できる機能がある場合もあります。 CHARの値 / VARCHAR / TEXT strの代わりに列 値(たとえば、MySQLdbでは、use_unicode=Trueを渡します connectに 呼び出す、またはcharset='UTF-8' データベースが古すぎて自動検出できない場合)、それを実行してください。次に、unicodeが作成されます オブジェクト、および.encode('utf-8')を呼び出すことができます それらに。

    一般に、Unicodeの問題に対処する最善の方法は、最後の方法です。すべてをできるだけ早くデコードし、すべての処理をUnicodeで実行してから、できるだけ遅くエンコードします。しかし、いずれにしても、一貫性を保つ必要があります。 strを呼び出さないでください unicodeの可能性があるもの; strを連結しないでください unicodeへのリテラル または、1つをそのreplaceに渡します 方法;など。組み合わせて組み合わせると、Pythonはデフォルトのエンコーディングを使用して暗黙的に変換しますが、これはほとんどの場合、必要なものではありません。

    ちなみに、これはPython3.xのUnicodeの変更が役立つ多くのことの1つです。まず、str エンコードされたバイトではなく、Unicodeテキストになりました。さらに重要なのは、持っている エンコードされたバイト(例:bytes) オブジェクト、encodeを呼び出します AttributeErrorが表示されます 再エンコードできるようにサイレントデコードを試みる代わりに。同様に、Unicodeとバイトを組み合わせて一致させようとすると、明らかなTypeErrorが得られます。 、場合によっては成功し、他の場合には要求しなかったエンコードまたはデコードに関する不可解なメッセージを表示する暗黙の変換の代わりに。




    1. MySQLで完全外部結合をシミュレートする効率的な方法は?

    2. Oracle:SQL開発者のエクスポートと同様に、selectステートメントの結果セットをINSERTSQLステートメントとしてエクスポートします。

    3. MySQLデータベースにMyISAMまたはInnoDBテーブルを使用する必要がありますか?

    4. Oracle 10gのピボット/クロス集計クエリ(動的列番号)