1. 程式人生 > >解決Mysql資料庫移動端發表情emoji報錯

解決Mysql資料庫移動端發表情emoji報錯

最近在開發的時候遇到了奇怪的錯誤

### Error updating database.  Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x84 ' for column 'reply_content' at row 1
### The error may involve com.palmboo.common.orm.ibatis.mapper.MyBatisMapper.insert-Inline
### The error occurred while setting parameters
### SQL: insert into tie(id,city,update_version,utime,latitude,del_flag,user_id,ctime,id,reply_content,longitude) values(?,?,?,?,?,?,?,?,?,?,?)
### Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x84 ' for column 'reply_content' at row 1
; uncategorized SQLException; SQL state [HY000]; error code [1366]; Incorrect string value: '\xF0\x9F\x98\x84 ' for column 'reply_content' at row 1; nested exception is java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x84 ' for column 'reply_content' at row 1 org.springframework.jdbc.UncategorizedSQLException: 

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

解決方法一
把你的資料庫編碼集設定為utf8mb4,無論是資料庫還是表,還是欄位。雖然會增加儲存,但是這個可以忽略不計。
utf8mb4編碼的最低mysql版本支援版本為5.5.3+
修改mysql配置檔案my.cnf

[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'

查詢my.cnf檔案可用以下方法

1.使用locate my.cnf命令可以列出所有的my.cnf檔案

2.ps aux|grep mysql|grep 'my.cnf'

3.檢視mysql啟動時讀取配置檔案的預設目錄mysql --help|grep 'my.cnf'

另外修改完需要重啟mysql服務,重新啟動mysql的兩種方式
service mysql restart
/usr/bin/mysqld_safe --defaults-extra-file=/etc/my.cnf  --datadir=/var/lib/mysql --pid-file=/var/lib/mysql/Server30.pid

配置成功後可以用以下sql確認修改效果,

SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';


解決方法二

有句話說得好,問題來了要麼解決要麼折中解決。如果有些原因你不能修改資料庫編碼之類的,你可以用java的一些外掛,如emoji-java這種emoji表情外掛對錶情進行特殊處理,然後儲存或者去掉表情,這也是一種解決方法哦。

		<dependency>
			<groupId>com.vdurmont</groupId>
			<artifactId>emoji-java</artifactId>
			<emoji.version>3.1.1</emoji.version>
		</dependency>

以下是java程式碼

import com.vdurmont.emoji.EmojiParser;


public class EmojiUtil {


	public static void main(String[] args) {
		String parseToAliases = EmojiParser.parseToHtmlHexadecimal("這裡是表情, csdn不支援utf8mb4,沒法添加了:)");
		System.out.println(parseToAliases);
		String parseToHtmlTag = EmojiParser.parseToUnicode(parseToAliases);
		System.out.println(parseToHtmlTag);
	}
}