测试机mysql版本为5.7.21,默认引擎为InnoDB,默认字符集为utf8。
字段插入Emoji表情具体报错内容如下:
Error updating database. Cause: java.sql.SQLException:
Incorrect string value: '\\xF0\\x9F\\x98\\x84' for column 'name' at row 1
### The error may involve com.lf.lffileserviceupload.dao.FileInfoMapper.insert-Inline\n### The error occurred while setting parameters
### SQL: insert into file_info (name, file_name, file_type, file_url, img_url, user_id, create_date) values (?, ?, ?, ?, ?, ?, ?)
### Cause: java.sql.SQLException: Incorrect string value: '\\xF0\\x9F\\x98\\x84' for column 'name' at row 1;
uncategorized SQLException; SQL state [HY000]; error code [1366]; Incorrect string value: '\\xF0\\x9F\\x98\\x84' for column 'name' at row 1; nested exception is java.sql.SQLException: Incorrect string value: '\\xF0\\x9F\\x98\\x84' for column 'name' at row 1"
原因分析:
根据编码规则,一个ASCII字符占1个字节,一个汉字占3个字节,标准的 UTF-8 字符集编码是可以用 1~4 个字节去编码21位字符。mysql的utf8只支持 1 到 3 个字节,并不算真正的UTF-8 而是 utf8mb3 的别名,Emoji表情占4个字节,超过了mysql的utf8最大支持长度,所以存储失败。mysql从5.5.3版本后新增utf8mb4字符集用于存储4个字节的unicode。mb4即 most bytes 4。utf8mb4 是 utf8 的超集并完美兼容utf8,能够用四个字节存储更多的字符,对数据没任何影响。若要存储Emoji表情,只需将mysql字符编码修改为utf8mb4即可。
操作步骤:
1、查看mysql版本,确认是5.5.3或之后的版本
select version();
1
2、修改mysql配置文件my.cnf或my.ini添加以下配置内容
注意:如果是从网络其他地方下载的绿色版,配置文件名为my-default.ini,复制这个文件,将副本文件名修改为my.ini,同时保留my-default.ini和my.ini这两个文件,然后在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'
注意:不要修改[client]、[mysql]、[mysqld]这三项之前已存在的配置内容,要在对用的标签下面添加以上配置项
3、重启mysql服务
4、查看mysql字符集编码变更是否生效
SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
确保图上红框处的五项配置值为utf8mb4,如果是可进行下一步,如果不是则要仔细检查第2步配置是否正确。
5、修改数据库字符集编码
(1)如果是新建数据库,新建时 字符集选择 utf8mb4 – UTF-8 Unicode ,排序规则选择 utf8mb4_general_ci
(2)如果库表已存在,执行以下语句修改字符集编码
//修改数据库字符集编码
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 table_name CHANGE column_name VARCHAR(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
6、mysql客户端配置项修改
数据源url添加 useUnicode=true&characterEncoding=utf-8&autoReconnect=true
特别说明:characterEncoding=utf-8会自动适配utf8bm4。
注意:mysql-connector-java.jar包必须是5.1.13之后的版本,否则不支持utf8mb4。
7、插入一条带表情字段的数据,测试修改是否成功
大功告成!!!