1. ホーム
  2. mysql

[解決済み] JDBC経由でMySQLにUTF-8を挿入しようとすると、"不正な文字列値 "と表示される?

2022-02-05 20:38:13

質問内容

私の接続はこのように設定されています。
Connection conn = DriverManager.getConnection(url + dbName + "?useUnicode=true&characterEncoding=utf-8", userName, password);

そして、テーブルに行を追加しようとすると、以下のエラーが発生します。
Incorrect string value: '\xF0\x90\x8D\x83\xF0\x90...' for column 'content' at row 1

数千件のレコードを挿入していますが、テキストに \xF0 が含まれていると必ずこのエラーが発生します(つまり、不正な文字列値は必ず \xF0 で始まる)。

列の照合順序はutf8_general_ciです。

何が問題なのでしょうか?

解決方法は?

MySQLの utf8 は、UTF-8 で 3 バイトで表現できる Unicode 文字のみを許可しています。ここでは、4バイトを必要とする文字があります。\xF0 ╱ 90 ╱ 8D╱ 83 ( u+10343 ゴシック文字サウイル ).

MySQL 5.5 以降の場合、カラムのエンコーディングは utf8 から utf8mb4 . このエンコーディングでは、UTF-8で4バイトを占有する文字を格納することができます。

また、サーバーのプロパティである character_set_server から utf8mb4 をMySQLの設定ファイルに追加してください。どうやら Connector/J のデフォルトは 3 バイトの Unicode で、それ以外の場合は :

たとえば、Connector/J で 4 バイトの UTF-8 文字セットを使用するには、MySQL サーバを次のように設定します。 character_set_server=utf8mb4 のままにしておいて characterEncoding を、Connector/J 接続文字列から削除します。Connector/J は UTF-8 設定を自動検出します。