前言:
在项目中遇到存入emoji表情到mysql时报错
原因:
mysql的utf8最大支持3字节的字符,而emoji和部分汉字是4字节的。需要改成utf8mb4字符集,mb4是most bytes 4的缩写。
1.查看数据库服务器和数据库字符集
指令:show variableslike'%character%'; 和 show variables like 'collation%';系统变量解释:
– character_set_server:默认的内部操作字符集
– character_set_client:客户端来源数据使用的字符集
– character_set_connection:连接层字符集
– character_set_results:查询结果字符集
– character_set_database:当前选中数据库的默认字符集
– character_set_system:系统元数据(字段名等)字符集
– 还有以collation_开头的同上面对应的变量,用来描述字符序,即排序规则
2.查看mysql所有数据库的字符集
指令:select SCHEMA_NAME,DEFAULT_CHARACTER_SET_NAME,DEFAULT_COLLATION_NAME,SQL_PATH from information_schema.SCHEMATA;
3.查看数据表的字符集
指令:show table status from 数据库名 like '数据表名';
4.查看数据表各字段的字符集
指令:show full columns from 数据表名;
上述数据库操作参考自:https://blog.csdn.net/leo__1990/article/details/93504528
在字符序中,_ci(case insensitive的缩写,大小写不敏感),_cs(case sensitive的缩写,大小写敏感),_bin(用编码值进行比较),_unicode(基于标准的Unicode来排序和比较,精确排序),_general(没有实现Unicode排序规则,速度更快)
通过查询上述指令,发现数据库是的字符集是utf8,数据表及其字段的字符序是utf8mb4_general_ci,字符集有三个作用域,优先级顺序为 列级 >表级 > 数据库级,此时应以字段(即列级)的字符集为主,但不懂为什么这样存入emoji还是失败,字段类型设置的是longtext,不知道和这有没有关系。
解决方案:
更改mysql配置
1.停止MySQL Server服务,修改mysql配置文件 my.cnf(其他系统)或者mysql.ini(windows系统)[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' //客户端连接后默认执行的sql语句
2.重启 MySQL 服务
PS:JDBC的URL地址中,characterEncoding设置为UTF-8