1. 程式人生 > >mysql儲存emoji表情報錯處理,qq互聯mysql儲存暱稱中帶表情的資料時報錯。

mysql儲存emoji表情報錯處理,qq互聯mysql儲存暱稱中帶表情的資料時報錯。

前言
 

    做qq互聯登入時發現一個問題,如果qq暱稱中有表情時存入mysql資料庫會報錯。

java.sql.SQLException: Incorrect string value: "ð" 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)

 

 原因是:mysql的utf8編碼的一個字元最多3個位元組,但是一個emoji表情為4個位元組,所以utf8不支援儲存emoji表情。但是utf8的超集utf8mb4一個字元最多能有4位元組,所以能支援emoji表情的儲存。

 

解決方法

    1.修改mysql 配置檔案/etc/my.cnf(window為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"

 

注意:mysql支援utf8mb4的版本是5.5.3+,必須升級到較新版本    

    2.修改database,table,column字符集   

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;

 

3.java語言修改db配置檔案

jdbc_driverClassName =com.mysql.jdbc.Driver
 
jdbc_url=jdbc:mysql://localhost:3306/databaseName?useUnicode=true&autoReconnect=true&rewriteBatchedStatements=TRUE
 
jdbc_username=root
 
jdbc_password=root

 

其中的characterEncoding=utf8可以自動被識別為utf8mb4(相容原來的utf8),而

autoReconnection(當資料庫連線異常中斷時,是否自動重新連線?預設為false)強烈建議配上,忽略這個屬性,可能導致快取緣故 ,
沒有讀取到DB最新的配置,導致一直無法試用utf8mb4字符集; 
記得要去掉characterEncoding=UTF-8”,因為mysql.cnf中已設定了init_connect="SET NAMES utf8mb4",否則還是不能儲存哦

    4.重啟mysql服務 檢查是否配置成功

mysql> show variables like "%char%";
 
+--------------------------+----------------------------------+
 
| Variable_name | Value |
 
+--------------------------+----------------------------------+
 
| character_set_client | utf8mb4 |
 
| character_set_connection | utf8mb4 |
 
| character_set_database | utf8mb4 |
 
| character_set_filesystem | binary |
 
| character_set_results | utf8mb4 |
 
| character_set_server | utf8mb4 |
 
| character_set_system | utf8 |
 
| character_sets_dir | /usr/local/mysql/share/charsets/ |
 
+--------------------------+----------------------------------+

 

    然後就可以愉快的登入啦。

原文地址:https://www.wanpishe.top/detail?blogId=1f422a92-a957-4132-a405-a702484490b6