首页 > 编程知识 正文

db数据库中文乱码,latin1和utf8

时间:2023-05-04 12:32:18 阅读:37185 作者:1202

以下是个人项目采用的方法,应该还有其他更优雅完美的方法。 记录在这里,从后面撞上就能马上填满洞

一、问题说明:

由于项目的需要,需要整合多个项目。 其中之一是缺省的latin1编码,因为在创建数据库时未设置编码格式。 结果,查询遇到中文时会发生乱码,需要进行转码操作。

二、问题处理过程(本项目为springboot mybatis ) :

1、经过多次验证,发现原数据库的插入数据格式为gbk,但数据库代码为latin1格式。 在线提供的大多数方案是备份库并重新调整数据库的编码格式。 实际上,首先风险暂且不谈,大多数情况下是不允许的。 如果您涉及到其他项目并处理它,则更改编码可能对您的项目没有影响,但也可能会影响正在使用其他库的项目。

2、设置项目

2.1、多数据源配置(注意加粗处,url中振动的爆米花编码格式根据实际需要设置。 如果原始库是gbk,则设置为gbk ) ) ) ) )。

spring : data source : db 1: # JDBC-URL : JDBC : MySQL ://host :3306/db1? useUnicode=true振动的爆米花=utf-8 server time zone=Asia/Shanghai URL : JDBC ://host :3306/db1? useUnicode=true振动的爆米花=gbkservertimezone=Asia/Shanghai username : rootpassword 3360 * * # 驱动type : com.Alibaba.druid.pool.druiddatasourcedriver-class-name 3360 com.MySQL.JDBC.drivermybatis 3360 type 设置连接指定代码配置项目connectioninitsqls : setnameslatin1db 2: # JDBC-URL 3360 JDBC 3360 MySQL 3360//host 33660 use unicode=true振动的弹出窗口Shaiurl : JDBC : MySQL 3360//host 33603306//DB2? useUnicode=true振动的爆米花=gbkservertimezone=Asia/Shanghai username : rootpassword 3360 * * # 驱动type : com.Alibaba.druid.pool.druiddatasourcedriver-class-name 3360 com.MySQL.JDBC.drivermybatis 3360 type setnameslatin1db 3: URL : JDBC : MySQL 3360//host :3306/db3? useUnicode=true振动的爆米花=gbkservertimezone=Asia/Shanghai username : rootpassword 3360 * * * 驱动type : com.Alibaba.druid.pool.druiddatasourcedriver-class-name 3360 com.MySQL.JDBC.drivermybatis 3360 type tnameslatin1(2.2、java设置项目(多数据源需要配置)、单个数据源设置与设置文件对应的项目即可。 以下是其中一个数据源的设置。 请注意,DataSource必须是DruidDataSourceBuilder,并且只有配置druid数据源connectionInitSqls才有用)。

package com.SaaS.mall.JZ.RMI.config; import com.Alibaba.druid.spring.boot.auto configure.druiddatasourcebuilder; importorg.Apache.ibatis.session.sqlsessionfactory; importorg.my batis.spring.sqlsessionfactorybean; importorg.my batis.spring.sqlsessiontemplate; importorg.my batis.spring.annotation.mappers can; import org.springframewo

rk.beans.factory.annotation.Qualifier;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import javax.sql.DataSource;/** * @Description: admin数据库数据源配置 * @Creater: sunxiang * @CreateTime: 2020年12月21日 下午 14:10 **/@Configuration@MapperScan(basePackages = "com.saas.mall.jz.rmi.dao.admin.mapper", sqlSessionFactoryRef = "adminSqlSessionFactory")public class DataSourceAdminConfig { @Bean("adminDataSource") @ConfigurationProperties(prefix = "spring.datasource.db1") public DataSource getDb1DataSource(){ //注意是DruidDataSourceBuilder 而不是DataSourceBuilder,后者的话设置无效 return DruidDataSourceBuilder.create().build(); } @Bean("adminSqlSessionFactory") public SqlSessionFactory db1SqlSessionFactory(@Qualifier("adminDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:sqlMapper/admin/*.xml")); return bean.getObject(); } @Bean("adminSqlSessionTemplate") public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("adminSqlSessionFactory") SqlSessionFactory sqlSessionFactory){ return new SqlSessionTemplate(sqlSessionFactory); }}

通过上面的配置,再插入和修改数据的时候在执行具体sql语句之前会将连接编码设置为 latin1格式的,保证与数据库编码一致。重点是配置文件中:connectionInitSqls: set names latin1 这个配置。具体作用自行百度下就知道了。这样就解决了插入数据的问题。
2.3、获取数据:
如果不做任何处理在获取数据的时候也会有乱码,因为查出来的为latin1编码格式。指导思路是对该编码转换,我的想法是:String s = new String(params.getBytes("ISO-8859-1"), "gbk");
上述语句中 params为乱码的字段名。
其中利用了mybatis的拦截器对所有的进行拦截处理:

package com.saas.mall.jz.rmi.filter;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import com.saas.mall.jz.rmi.util.BeanCopyUtil;import org.apache.ibatis.executor.Executor;import org.apache.ibatis.mapping.MappedStatement;import org.apache.ibatis.plugin.*;import org.apache.ibatis.session.ResultHandler;import org.apache.ibatis.session.RowBounds;import org.springframework.stereotype.Component;import java.util.ArrayList;import java.util.List;import java.util.Map;import java.util.Properties;@Component//拦截Executor类的query方法@Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})})public class MybatisInterceptor implements Interceptor { @SuppressWarnings({"rawtypes", "unchecked"}) public Object intercept(Invocation invocation) throws Throwable { Object result = invocation.proceed(); //执行请求方法,并将所得结果保存到result中 if (result instanceof ArrayList) { List list = new ArrayList(); ArrayList resultList = (ArrayList) result; for (int i = 0; i < resultList.size(); i++) { Object object = resultList.get(i); if (object instanceof Integer || object instanceof Long) { list.add(object); } else { Class<?> aClass = object.getClass(); //对object进行转码,然后重新赋值返回,如果其他类型需要自行根据实际情况进行处理,ISO-8859-1对应的即为latin1编码 String s = new String(JSONObject.toJSONString(object).getBytes("ISO-8859-1"), "gbk"); Object object1 = JSONObject.toJavaObject(JSON.parseObject(s), aClass); list.add(object1); } } return list; } return result; } public Object plugin(Object target) { return Plugin.wrap(target, this); } public void setProperties(Properties arg0) { }}

注入上面的拦截器使生效:

import com.saas.mall.jz.rmi.filter.MybatisInterceptor;import org.apache.ibatis.session.SqlSessionFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.autoconfigure.AutoConfigureAfter;import org.springframework.context.annotation.Configuration;import javax.annotation.PostConstruct;import java.util.List;import java.util.Properties;@Configurationpublic class MyBatisConfig { @Autowired private List<SqlSessionFactory> sqlSessionFactoryList; @PostConstruct public void addMySqlInterceptor() { //自己定义的插件拦截器类,注入到sqlSessionFactory配置中 MybatisInterceptor interceptor = new MybatisInterceptor(); for (SqlSessionFactory sqlSessionFactory : sqlSessionFactoryList) { sqlSessionFactory.getConfiguration().addInterceptor(interceptor); } }}

上面的操作就完美实现插入和查询的中文乱码问题。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。