mysql: insert時にIncorrect string valueエラー

事象

  • pythonを使って入力値をテーブルにインサートする際に、次のエラーが発生します。
    今回のケースでは、入力値に絵文字が含まれている場合に発生するようです。

  • 使用環境は次の通りです。
    OSWindows 10(64ビット)
    言語Python 3.11.7
    DBmysql 5.7.27 (winx64, linux)

対応

  • mysqlでは、クライアントからのデータベース接続、データベース、テーブル、カラム等の各レベルで文字セット(CHARACTER SET)を指定できます。絵文字等のUTF-8で4バイトになる文字を扱うためには、文字セットとしてutf8mb4を指定する必要があります。
    • unicodeには、当初から存在する基本的な文字群(基本多言語面)、後から追加された文字群(追加多言語面)が含まれています。基本多言語面の文字群は3バイトで表現されますが、絵文字等の追加多言語面の文字群は4バイト(サロゲートペア)で表現されます。
    • 文字セットutf8は、基本多言語面の3バイトまでの文字に対応します。
    • 文字セットutf8mb4は、基本多言語面+追加多言語面の4バイトまでの文字に対応します。
    • 各文字セットの詳細は、リファレンス 「10.9 Unicode のサポート」をご覧ください。
  • 各種の文字セットを確認する例です。
    show variables, show create table等で文字セットを確認できます。
  • 私の場合、エラーメッセージで明記されたremarks列の文字セットが”CHARACTER SET utf8″になっていることが原因のようです。次のように列の文字コードをutf8mb4に変更することで問題が解決しました。各レベルでの文字セットの指定方法はリファレンスをご覧ください。