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")

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

在使用JDBC连接MySQL数据库时,如果在插入中文数据时出现乱码,可以通过以下步骤解决问题: 第一步,确保MySQL数据库的字符集设置正确。可以通过修改MySQL配置文件my.cnf或者my.ini来设置字符集为utf8。确保以下两个地方的字符集设置为utf8: - character_set_server = utf8 - collation_server = utf8_general_ci 第二步,确保JDBC连接字符串中设置了正确的字符编码。在连接MySQL数据库时,需要在JDBC连接字符串中添加参数"useUnicode=true"和"characterEncoding=UTF-8",例如: String url = "jdbc:mysql://127.0.0.1:3306/db1?useUnicode=true&characterEncoding=UTF-8"; 第三步,确保Java代码中使用UTF-8编码处理中文数据。在Java代码中,确保使用UTF-8编码处理中文字符串,例如: String name = "中文数据"; byte[] utf8Bytes = name.getBytes("UTF-8"); 通过以上步骤,可以解决JDBC连接MySQL数据库中文乱码问题,确保能够正确地插入和读取中文数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [JDBC连接MySQL后出现中文字符乱码的问题及其解决方案](https://blog.csdn.net/crabxd/article/details/127894292)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值