项目场景:
在一些企业的老旧系统的数据库选用的字符集与现在开发的新系统所需的字符集有冲突时需要转换字符串的编码类型否则会出现乱码问题。
我的这个项目时基于原来老旧的维修工单系统开发新的移动端Java接口(老系统是使用php编写的),出现了数据乱码的现象。
问题描述:
老系统的数据库字符集是latin1
,现在同过Java开发了接口,接口的返回值在前端显示的都是一堆乱码,前端要求我解决乱码问题,因为不能影响现在的业务,更不能丢失数据,所以数据库上的改动字符集是无法进行的,因此只能是在代码里进行编码的转换。
原因分析:
老系统的数据库字符集是latin1
,老系统在数据库中存储的是gbk
编码的的数据。
解决方案:
方法一:
这个方法比较笨,我在度娘参考了一些文档后使用了一个在SQL
上进行编码转换的方法,直接在mybatis的mapper里编写SQL
,不多说了,上代码:
SELECT
CONVERT ( unhex( hex( CONVERT ( name USING latin1 ) ) ) USING gb2312 ) name
FROM users
通过这个sql可以在我这个项目的数据库中得到能正常显示的数据。
方法二:
方法一在我看来很笨,它会根据我们所需的数据库字段的增加,我们所编写的SQL代码的长度也将增加。
所以我找了这个方法二,它是通过使用java的Sting类的方法进行编码的转换操作,代码如下:
使用时转换编码:
User user = userRepository.selectByPrimaryKey(1);
user.setName(String.valueOf(user.getName()).getBytes("GB2312"));
直接在实体类的get方法中转换编码:
@Table(name = "users")
public class user{
@ApiModelProperty(value = "姓名")
private String name;
public String getName() {
return name.getBytes("GB2312");
}
public void setName(String name) {
this.name= name;
}
}