JDBC从mysql查询中文乱码问题

    之前需要使用JAVA写一个导出的软件,由用户提供数据库,我这边来解析导出成XML文件,数据库中的编码使用的默认的latin1,数据库中的中文已经是乱码了,使用mysql客户端查询时,通过:

set names latin1

可以正常查询出中文。

    但是,在使用JDBC查询出来的结果集,却总是乱码,尝试过各种方法,比如characterEncoding参数等等。但是一直是乱码。在JAVA端使用ISO8859_1解码也无法正常显示出中文,后来经朋友帮忙,在MYSQL官网查询到原来在JAVA中与latin1对应的编码应该是Cp1252,使用Cp1252解码终于可以显示中文了。


    之后在查询过程中,又出现问题,还是有一部分中文显示乱码。无法正常显示。编码应该是没有问题了,但是为什么还是显示乱码呢? 又在网上查了很久的资料,才找到问题:

MYSQL编码问题

原来Mysql 的latin1 不等于标准的latin1(iso-8859-1) 和cp1252,比iso-8859-1多了0x80-0x9f字符,比cp1252多了0x81,0x8d,0x8f,0x90,0x9d 一共5个字符


目前找到两种适合自己的解决方式:

一、通过MYSQL函数进行转换,在MYSQL服务端就转成所需要的UTF-8编码再发送。可以使用:

SELECT convert(unhex(hex(convert(columnName using latin1))) using utf8) as name from table

这样取出来的中文就不会乱码了。


二、通过JDBC结果集的getBytes方法来拿到原始字节码,再通过UTF-8来建立新字符串即可获得正常的中文。


还有一种方式是通过JAVA代码来进行转换,但是由于Cp1252和标准的差异,在对数据进行以下操作后:

new String(getBytes("Cp1252"),"UTF-8")

有部分中文是无法正常显示的。如果哪位有好的方法可以提供一下。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值