最近在开发的时候遇到了奇怪的错误
### 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);
}
}