Mysql字符集修改问题由utf8改为utf8mb4
一、问题原由:
由于原有的mysql表中的字段的字符集为utf8不能写入四个字符的文字,导致插入失败
二、解决方案:
由于这是公司项目中的问题,mysql相关的问题要找对应的DBA,dba修改了相应的字段后,
1、在数据库进行测试,确保mysql表中可以正常插入四个字节的字符
set names utf8mb4;
use inbound;
insert into ib_t_bp_master_inbound(bp_id, company_code) values(11,'𡘙師傅便當專賣店-北平店');
经测试,可以正常插入。
2、修改代码中mysql-connector-java的jar包,由原来的5.1.21升级到5.1.49,5中的最高版本。
这里首先看一下mysql官网文档对于使用的mysql驱动的说明:https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-charsets.html 对于驱动版本有明确要求。
可以针对自己使用的jar包的版本进行设置,为了方便使用,我直接将jar包升级到5.1.49.直接支持utf8mb4.
3、修改java链接mysql驱动版本
项目中使用的druid数据源配置上需要加上connectionInitSqls属性配置,具体如下:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
....此处省略其他属性.....
<property name="connectionInitSqls" value="set names utf8mb4;" />
</bean>
ps.但是我实际测试下来,这个参数不加也没有什么问题,可以正常保存这种特殊字符和emoji表情,官方建议配置。
数据库连接串配置
我们的配置如下:
jdbc.url=jdbc:mysql://ip:port/databaseName?useUnicode=true&characterEncoding=UTF-8&noAccessToProcedureBodies=true&autoReconnect=true
建议去掉useUnicode和characterEncoding的配置,使用如下配置:
jdbc.url=jdbc:mysql://ip:port/databaseName?noAccessToProcedureBodies=true&autoReconnect=true
ps.但是我实际测试下来,连接串上增加useUnicode=true&characterEncoding=utf8也没有什么问题,可以正常保存这种特殊字符和emoji表情。
参考资料:
https://ningyu1.github.io/site/post/81-mysql-utf8mb4/
https://www.cnblogs.com/silenceshining/p/12556131.html
https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-charsets.html