1. ホーム
  2. mysql

[解決済み] Incorrect string value "エラーを修正する方法は?

2022-04-15 18:34:46

質問

あるアプリケーションが、不正な文字列値のエラーのためにランダムなメールを破棄する傾向があることに気づいた後、私は、多くのテキストカラムを切り替えて、その中で utf8 カラムの文字セットとデフォルトのカラム照合順序 ( utf8_general_ci を受け入れるようにしました。 これにより、ほとんどのエラーが修正され、非ラテン語の電子メールに当たったときにSQLエラーが発生しなくなりました。

それにもかかわらず、いくつかの電子メールでは、プログラムが不正な文字列値のエラーを引き起こすことがあります。 (Incorrect string value: '\xE4\xC5\xCC\xC9\xD3\xD8...' for column 'contents' at row 1)

コンテンツ欄が MEDIUMTEXT を使用するデータティービーです。 utf8 カラムの文字セットと utf8_general_ci カラムの照合順序を指定します。 この列には、切り替えられるフラグがありません。

アプリケーションのソースコードは、必要なとき以外は触りたくないし、見たくもないということを念頭に置いています。

  • そのエラーの原因は何ですか?(はい、メールがランダムなゴミでいっぱいなのは知っていますが、utf8はかなり寛容であろうと思いました)
  • どうすれば直せますか?
  • 修正した場合、どのような効果が期待できますか?

一つは、バイナリフラグをオンにしたutf8 varchar([何らかの大きな数字])に切り替えることを考えましたが、私はむしろMySQLに精通しておらず、そのような修正が意味を持つかどうかは全くわかりません。

解決方法は?

"\xE4\xC5\xCC\xC9\xD3\xD8" は有効なUTF-8ではありません。 Pythonでテストしています。

>>> "\xE4\xC5\xCC\xC9\xD3\xD8".decode("utf-8")
...
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-2: invalid data

データベース内でのデコードエラーを回避する方法を探しているのであれば、cp1252エンコーディング(別名"Windows-1252"別名"Windows Western European")は最も寛容なエンコーディングで、すべてのバイト値が有効なコードポイントになります。

もちろん、純正のUTF-8や、p1252以外のエンコーディングはもう理解できませんが、その点はあまり気にされていないようですね?