关闭

JDBC从mysql查询中文乱码问题

1354人阅读 评论(1) 收藏 举报

    之前需要使用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")

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:23471次
    • 积分:427
    • 等级:
    • 排名:千里之外
    • 原创:18篇
    • 转载:4篇
    • 译文:1篇
    • 评论:8条
    文章分类
    最新评论