java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for colum n 'name' at row 1 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2620) at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1662) at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1581)
解決策:
1. データベースレベルで解決します (MySQL は utf8mb4 バージョン 5.5.3 以降をサポートしているため、新しいバージョンにアップグレードする必要があります)
注:
(1. データベース、テーブル、列の文字セットを変更します
)
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;ALTER TABLE table_name CHANGE column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
(2. mysql 設定ファイル my.cnf を変更します (ウィンドウは my.ini)
[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4'
(3. Java サーバーを使用している場合は、mysql 接続バージョンをアップグレードするか確認します) 5.1.13 より高い、そうでない場合はまだ utf8mb4 を試すことができません
(4. サーバー側の DB 設定ファイル
jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE jdbc.username=root jdbc.password=password
mysql-connector をアップグレードすると、characterEncoding=utf8 が自動的に認識されますutf8mb4 (オリジナルの utf8 と互換性あり)、および
autoReconnection (データベース接続が異常に中断された場合、自動的に再接続しますか? デフォルトは false) を追加することを強くお勧めします。この属性を無視すると、キャッシュが発生する可能性があります。 DB の設定が読み込まれていないため、utf8mb4 文字セットを試行できません
2. アプリケーション層から解決します
URLEncoder.encode(nickName, "utf-8");
データベースから取り出して表示の準備ができたらデコードします。
URLDecoder.decode(nickname, "utf-8");
アプリケーション層から問題を解決するときは、オブジェクトゲッターで直接エンコードしないことをお勧めしますsetter メソッドは、オブジェクトを配置するときにニックネームをエンコードするため、これを参照すると、オブジェクトから getter メソッドを呼び出すことと同じになります。これは、上記の問題が引き続き発生することを意味します。
mysql で保存された絵文字表現 (WeChat 開発ユーザーのニックネーム) については、PHP 中国語 Web サイトを参照してください。