关于jdbc操作MySql数据库中文乱码的问题

本文探讨了Java操作MySQL数据库时出现中文乱码的原因及解决方案。主要原因是JDBC驱动默认使用ISO-8859-1编码进行转换,而数据库实际使用的可能是GBK等编码。通过在JDBC连接URL中指定正确的字符集可以解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在写java操作mysql数据库的代码时会遇到查询出的结果或者插入到数据库中的数据中文乱码的现象。这种现象是怎么出现的呢?原理是怎样的呢?  

首相,mysql数据库中的东西都是二进制存放的,支持任何数据,当然包括中文。乱码的产生在于联系java与mysql的那一层即jdbc driver。   

java 内部使用 unicode ,而mysql 缺省使用 iso-8859-1,所以 jdbc driver 把查询字符串传给 mysql server 时,会做 unicode->iso-8859-1 的转换,从 mysql server 接受结果时,会做 iso-8859-1->unicode 的转换。
这样就有问题了,在命令行下插入数据库的中文字符串是 GBK ,所以 jdbc driver 接受查询结果时,应该做 GBK->unicode 的转换才对。   
验证一下,对从数据库中读出的中文字串 data

new String(data.getByte("iso-8xxx"), "gbk" ) 

将 data 先做一个 unicode->iso-8xxx 转换成它存放在数据库中的原始模样。我们知道它是 gbk ,所以手工来 gbk->unicode ,这样 java 程序就显式正常了。   
类似,写入数据库的时候,我们期待 jdbc driver 会把 unicode->gbk ,结果却是 unicode->iso-8859-1 ,当然是乱码了。   
知道了乱码产生的原理,那如何解决这个问题呢?   
想一想,写 mysql jdbc driver 的家伙会连转码都不知道?    
其实jdbc driver里提供了解决方案,就是在jdbc url中加一个参数:characterEncoding=GBK,告诉 jdbc driver 强制按指定参数转码 即可。  

另外,其实jdbc driver的源代码里是有自动探测数据库的字符集的,从而做相应的转换的。如果判读数据库使用的是单字节,则调用自己的转换函数(自称效率远大于jvm自带的方法)。但这段代码后面在探测到目标数据库为多字节编码时忘了去使用jvm自带的转换方法,从而继续使用缺省的iso-8859-1的转换。这样就造成了乱码现象。如果想彻底解决这个问题,可以修改jdbc driver相应地方的代码即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值