Mysql數據庫保存emoji等表情符號的問題

事由

做了一個存原因的表單,偏偏有好多人喜歡輸入表情符號,導致總是報錯,報錯信息如下:

java.sql.SQLException: 
			Incorrect string value: '\xF0\x9F\x92\x94' for column '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是兩個字節的,表情符是四個字節的

兼容問題

mysql提供四個字節的編碼 - utf8mb4,下面是與utf8對比
UTF- 8:Unicode Transformation Format-8bit,允許含BOM,但通常不含BOM。是用以解決國際上字符的一種多字節編碼,它對英文使用8位(即一個字節),中文使用24爲(三個字節)來編碼。UTF-8包含全世界所有國家需要用到的字符,是國際編碼,通用性強。UTF-8編碼的文字可以在各國支持UTF8字符集的瀏覽器上顯示。如果是UTF8編碼,則在外國人的英文IE上也能顯示中文,他們無需下載IE的中文語言支持包。
UTF8MB4:MySQL在5.5.3之後增加了utf8mb4的編碼,mb4就是most bytes 4的意思,專門用來兼容四字節的unicode。
utf8mb4作爲utf8的super set,完全向下兼容,所以不用擔心字符的兼容性問題。切換中需要顧慮的主要影響是mysql需要重新啓動(雖然mysql官方文檔說可以動態修改配置,但是經過數次測試,還是需要重啓纔可生效),對於業務可用率的影響是需要考慮的大問題,這裏就暫時不展開討論了。

升級步驟

  1. 第一步,檢查mysql版本,需要升級mysql版本爲5.5.3+

    如果你的版本低於5.5.3,那你需要升級你的數據庫,因爲低版本是不支持utf8mb4的,查看mysql版本方法,下面列舉兩個方法:
#limux下
[root]$ mysql -V
#或者mysql指令模式下
mysql> select version();
  1. 第二步,修改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;
  1. 第三步:修改mysql配置文件my.cnf(windows爲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'
  1. 第四步,重啓mysql服務,然後檢查字符集設置是否生效

1.)重啓命令參考:/etc/init.d/mysql restart

2.)輸入命令:mysql,進入mysql命令行(如果提示沒權限,可以嘗試輸入mysql -uroot -p你的密碼)

3.)在mysql命令行中輸入:SHOW VARIABLES WHERE Variable_name LIKE ‘character_set_%’ OR Variable_name LIKE ‘collation%’;

檢查是否如下:

+--------------------------+--------------------+
| 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              |
| collation_connection    | utf8mb4_unicode_ci |
| collation_database      | utf8mb4_unicode_ci |
| collation_server        | utf8mb4_unicode_ci |
+--------------------------+--------------------+
rows in set (0.00 sec)

必須保證
character_set_client
character_set_connection
character_set_database
character_set_results
character_set_server
爲utf8mb4

  1. 第五步,如果你是java項目,一定要檢查mysql開發包版本,5.1.13+

    低於5.1.13版本是無法使用utf8mb4的,建議下載最新的開發包
  2. 第六步,檢查您的數據庫連接配置文件

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8&autoReconnect=true
jdbc.username=root
jdbc.password=password

其中的characterEncoding=utf8可以被自動被識別爲utf8mb4(當然也兼容原來的utf8),而autoReconnect配置我強烈建議配上,可能導致因爲緩存緣故,沒有讀取到DB最新配置

關注公衆號,每天進步一點點!
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章