MySQL存储表情时报错:java.sql.SQLException: Incorrect string value:‘\xF0\x9F\x92\xA9\x0D\x0A…’的解决方法
前情提要
1.数据库的版本以及数据库的编码是否按照utf8mb4修改,
- 首先你要保证你的mysql数据库能够存储emjio表情。建议先使用sql语句手动执行一下。
INSERT INTO `db_name`.`table_name` (field_name) VALUES ('🙂')
- 如果不能存储查看数据的编码方式(以下是修改完正确的格式)
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
网上有好多数据库修改编码的方式(这里随便从网上查了一个),这个时候数据库应该可以直接插入
-- 修改数据库字符集:
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 CHANGE column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
注意:mysql低版本的不支持utf8mb4
2.java链接数据库配置文件的修改
initConnectionSqls或者connectionInitSqls配置一定要添加上
具体根据自己读取配置文件的方式去添加
public DataSource getDataSource() throws Exception {
Properties props = new Properties();
props.put("driverClassName", "com.mysql.jdbc.Driver");
props.put("url", "你的jdbc连接串");
props.put("username", "你的用户名");
props.put("password", "你的密码");
props.put("initConnectionSqls", "set names utf8mb4;");
return DruidDataSourceFactory.createDataSource(props);
}
比较新的druid版本:initConnectionSqls
旧的版本:connectionInitSqls
这个配置项一定要写对,网上很多的教程写的都是针对自己版本写的
网上好多人说不要在jdbc url中写characterEncoding,我自己的项目如果不写的话,中文插入的时候直接就乱码了,反正可以试试,我反正添加了也没有影响
3.mysql-connector-java的版本,
- 看下自己的项目中mysql-connector-java依赖的版本,我就是这个原因卡了半天,之前项目依赖的是5.1.6版本(不能用)的,然后改了配置,不管用,翻看了半天源码没有找到原因,最后改为5.1.47,完美解决。