解决Spring boot+Mybatis+MySQL插入中文乱码

问题描述

最近在学习Springboot+vue的项目时,遇到添加数据中文显示乱码

在这里插入图片描述

问题分析

  1. 首先怀疑mysql字符编码格式不是utf-8导致
  2. 在服务器端编码格式错误,导致存到mysql也是乱码
  3. mybatis配置不正确,导致乱码

问题排查

1 mysql字符编码格式

首先查看建表语句

show create table position

显示

position | CREATE TABLE `position` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL COMMENT '职位',
  `createDate` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `enabled` tinyint(1) DEFAULT '1',
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8

由上可以看出,这里的默认编码格式为utf8。所以暂时排除mysql字符编码的问题

2 服务端编码格式

这里,直接通过debug进入断点,并没有发现字符编码错误,所以直接排除

3 mybatis配置不正确

查看我们的配置文件:application.properties

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=root
spring.datasource.password=fangxiang
spring.datasource.url=jdbc:mysql://localhost:3306/vhr

server.port=8081

发现在url配置项中没有指定编码格式,于是将url配置项改成

spring.datasource.url=jdbc:mysql://localhost:3306/vhr?useUnicode=true&characterEncoding=utf8

然后,我们重启项目,到这里,问题应该解决了,没有解决也只能帮到这里了。

参考链接

https://www.jianshu.com/p/bd0311a33c16

<think>嗯,用户的问题是关于在Spring Boot项目中,使用Druid和MyBatis连接Oracle多数据源时,编码格式不一致导致的问题,需要确保插入和查询都用UTF-8编码。首先,我需要回忆一下相关的配置步骤以及可能出问题的地方。 首先,用户提到的是多数据源配置,所以应该检查每个数据源的URL是否正确设置了字符编码。根据引用中的例子,比如引用3里的MySQL配置,URL里加了useUnicode和characterEncoding参数。Oracle可能也有类似的参数需要设置。不过Oracle的JDBC驱动参数可能和MySQL不同,需要确认正确的参数名称。 然后,用户使用Druid作为连接池,所以每个数据源的配置应该在application.yml中分别指定,特别是URL部分。引用1和引用2提到多数据源的配置,其中引用1的例子中URL里有characterEncoding=utf8,但用户的问题可能出现在Oracle的配置中没有正确设置这些参数。 接下来,Oracle数据库本身的字符集也需要确认是否是AL32UTF8或者UTF8,否则即使应用层设置了,数据库存储时可能还是会转换。这可能需要DBA的协助,但应用配置同样重要。 MyBatis的配置部分,可能需要检查XML映射文件中是否有正确的参数设置,比如在插入时指定jdbcType,或者在全局配置中设置useUnicode和characterEncoding。另外,MyBatis的SQL会话工厂是否关联了正确配置的数据源,确保每个数据源都正确应用了编码设置。 还有,连接池的配置,比如Druid,是否在连接初始化时执行了修改编码的SQL语句,比如ALTER SESSION SET NLS_LANGUAGE=AMERICAN等,来确保会话级别的编码正确。引用1中的例子有类似的初始化SQL,用户可能需要为Oracle数据源添加这样的设置。 另外,检查应用的全局字符编码过滤器,比如Spring的CharacterEncodingFilter,确保请求和响应的编码都是UTF-8。有时候,虽然数据库和JDBC配置正确,但应用层没有正确处理字符编码,也会导致乱码。 还有可能的问题点包括:数据库表结构的字段是否使用NVARCHAR2等支持Unicode的类型,而不仅仅是VARCHAR2;JDBC驱动版本是否过旧,可能需要升级到支持更好编码处理的版本。 综合这些步骤,解决方案应该包括检查并正确配置每个Oracle数据源的URL参数,设置Druid的初始化SQL,验证数据库和服务器的字符集,配置MyBatis和全局过滤器,以及确保字段类型正确。此外,测试插入和查询操作,使用日志或工具监控实际传输的编码是否正确,也是必要的验证步骤。</think>### 分步解决方案 #### 1. **配置Oracle数据源URL参数** 在Spring Boot的`application.yml`中为每个Oracle数据源添加`useUnicode`和`characterEncoding`参数,确保连接时强制使用UTF-8编码: ```yaml datasource: oracle1: url: jdbc:oracle:thin:@//host:port/service_name?useUnicode=true&characterEncoding=UTF-8 username: "特殊账号" # 特殊符号需单引号包裹[^1] driver-class-name: oracle.jdbc.OracleDriver oracle2: url: jdbc:oracle:thin:@//host:port/service_name?useUnicode=true&characterEncoding=UTF-8 ``` > **注意**:Oracle官方驱动对`characterEncoding`的支持有限,需配合其他参数使用[^3]。 --- #### 2. **设置Druid连接池初始化SQL** 在Druid配置中添加初始化SQL命令,强制会话级编码: ```yaml druid: oracle1: connection-init-sqls: - "ALTER SESSION SET NLS_LANGUAGE=AMERICAN" - "ALTER SESSION SET NLS_TERRITORY=AMERICA" - "ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'" ``` 此配置可统一日期、语言等字符集相关参数。 --- #### 3. **验证数据库服务器字符集** 通过SQL检查Oracle服务器字符集: ```sql SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET'); ``` 确保结果包含`AL32UTF8`或`UTF8`。若为`ZHS16GBK`等,需联系DBA修改数据库字符集。 --- #### 4. **配置MyBatis参数** 在MyBatis的XML映射文件中明确指定`jdbcType`: ```xml <insert id="insertData"> INSERT INTO table (content) VALUES (#{content,jdbcType=VARCHAR}) </insert> ``` 同时,在`mybatis-config.xml`中全局配置: ```xml <settings> <setting name="jdbcTypeForNull" value="NULL"/> <setting name="defaultStatementTimeout" value="30"/> </settings> ``` --- #### 5. **应用层全局编码过滤器** 添加Spring的`CharacterEncodingFilter`: ```java @Bean public FilterRegistrationBean<CharacterEncodingFilter> encodingFilter() { FilterRegistrationBean<CharacterEncodingFilter> bean = new FilterRegistrationBean<>(); bean.setFilter(new CharacterEncodingFilter()); bean.addInitParameter("encoding", "UTF-8"); bean.addInitParameter("forceEncoding", "true"); bean.addUrlPatterns("/*"); return bean; } ``` --- #### 6. **字段类型与驱动验证** - 数据库字段类型应使用`NVARCHAR2`代替`VARCHAR2`以支持完整Unicode - 升级Oracle JDBC驱动至最新版本(如ojdbc8.jar) --- #### 验证步骤 1. 插入包含中文和特殊符号的测试数据 2. 直接查询数据库确认存储结果 3. 通过MyBatis查询后检查返回结果 4. 使用`Wireshark`或`JDBC日志`监控实际传输编码 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值