解决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);
	}
}

猜你喜欢

转载自blog.csdn.net/ieflex/article/details/80883608