ホームページ  >  記事  >  WeChat アプレット  >  mysql は絵文字表現 (WeChat 開発ユーザーのニックネーム..) を保存します。

mysql は絵文字表現 (WeChat 開発ユーザーのニックネーム..) を保存します。

高洛峰
高洛峰オリジナル
2017-02-15 10:47:282422ブラウズ

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)

上記のエラーが報告される場合は、Java コードのフィールドがデータベースのフィールド タイプまたはエンコーディングと一致していない可能性があります。この場合は、形式またはエンコーディングを統一してください。

ここでは主にデータベースに絵文字画像を挿入する際のエラーと解決策を紹介します


mysqlデータベースを使用する場合、文字セットがUTF-8でJavaサーバー上で絵文字表現を保存する場合、上記のようになります。スローされる異常 (たとえば、WeChat 開発ではユーザーのニックネームが取得され、一部のユーザーのニックネームでは絵文字画像が使用されます)

これは、UTF-8 エンコーディングが 2、3、または 4 である可能性があるため、文字セットがサポートされていないための例外です。文字セクションでは、絵文字表現が 4 バイト、mysql の UTF-8 エンコーディングが 3 バイトまでであるため、データを挿入できません。

解決策:
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 サイトを参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。