`
superhj1987
  • 浏览: 203361 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多

在写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相应地方的代码即可。

分享到:
评论

相关推荐

    jdbc连接数据库的乱码问题(已解决)

    jdbc连接mysql出现了乱码,总结起来就是里面的四个编码方式是一样的时候,就不会乱码了,简之,客户连接数据库返回结果(编码必须一致)。

    使用JDBC连接Mysql数据库会出现的问题总结

    主要给大家介绍了关于使用JDBC连接Mysql数据库会出现的问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    JDBC数据库操作乱码无缝过渡解决方案

    JDBC数据库操作乱码非主流解决方案---JDBC连接驱动代理 以驱动的方式提供给使用方,在底层实现连接的代理管理功能,向使用者隐藏 实现过程以及无缝的过渡 你需要了解下列参数: proxy.driver= (必须)实际要连接...

    向MySQL数据库存中文显示乱码

     数据库是我们软件开发中一个非常重要的组成部分,以前小编使用的是SQL Server,没有遇到过存储的中文是乱码的情况,后来在ssh的项目中使用的是MySQL的项目,遇到了乱码的问题,只要向数据库中存储中文数据会是...

    基于JSP+Servlet+JDBC+mysql的图书管理系统源码(课程设计).zip

    图书管理系统项目使用eclipse开发工具和MySql数据库进行开发,maven方式创建项目,编码格式为utf-8(如出现乱码可改成utf-8), 项目分成三层架构,数据访问层、业务逻辑层和表现层,并没有使用框架等复杂的技术,...

    JDBC数据库常用操作封装

    封装了jdbc常用操作,增删改查,查询ResultSet指定位置的记录,返回ResultSet每个列的名字,查询ResultSet中记录的行数...... 含源代码,测试代码!...乱码问题自己解决目前支持mysql/ms sqlserver. enjoy. :)

    JDBC数据库常用操作封装(升级版)

    为方便大家下载,由5分改为0分! 看前面的那一版注释,加了同步,线程安全,封装了jdbc常用操作,增删改查,查询ResultSet指定位置的记录,返回ResultSet每个列的名字...乱码问题自己解决目前支持mysql/ms sqlserver. enjoy. :)

    MySQL乱码的几种原因

     2、在数据库连接上加这么一段jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8,保证传输过程是utf-8的。  3、设置数据库的编码为utf-8,在my.ini设置或者在Conf

    JDBC连接mysql处理中文时乱码解决办法详解

    主要介绍了JDBC连接mysql处理中文时乱码解决办法详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下

    mysql乱码解决方案

    linux 系统下mysql中文乱码问题的解决方案 1、在命令行中输入alter database 数据库名 default character set utf8; 设置字符编码方式 2、 set names utf8; 设置显示方式 3 、jdbc中url的路径后跟上?useUnicode=true...

    MySQL5.0安装图解.docx

    昨天看同学用Java连接MySQL数据库的时候,出现了乱码,这是我不知道的,我马上上网去查JDBC连接MySQL的操作,发现在用JDBC方式连接MySQL数据库的时候要传递一个能解决乱码的参数,才能将不是乱码的数据插入到数据库...

    Mysql的longblob字段插入数据问题解决

    想改变这个问题,需要注意几点: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (2054817 > 1048576). You can change this value on the server by setting the max_allowed_packet’ ...

    浅谈mysql的中文乱码问题

    首先,我用的mysql版本号是5.5.17的,最近遇到的问题是在eclipse中通过jdbc往数据库写中文数据的时候,在数据库中显示的是??即乱码,为解决这个问题,搞了一个晚上(当然熄灯后就就寝了(__) )外加早上这会儿,搞...

    mysql 乱码问题

    在之前的之前就已经对Mysql测试过纯JDBC和jsp下,中文乱码是没问题的了,且统一都设成了GBK的。所以一开始根本就没注意到数据库本身上来。只考虑,在前台这边是不是没统一编码的格式!于是添加啊添加,结果该添加的...

    mysql安装过程

    昨天看同学用Java连接MySQL数据库的时候,出现了乱码,这是我不知道的,我马上上网去查JDBC连接MySQL的操作,发现在用JDBC方式连接MySQL数据库的时候要传递一个能解决乱码的参数,才能将不是乱码的数据插入到数据库...

    j2ee项目中中文乱码问题集锦

    j2ee项目中中文乱码问题集锦 》》》》 6 如果用Eclipse开发,把工程编码改为utf-8 7 用myeclipse提供的数据库前端工具,URL也进行设置 jdbc:mysql://localhost:3306/mysql?useUnicode=true&;characterEncoding=...

    linux下mysql乱码问题的解决方案

    项目进行到和服务器交互,通过post访问服务器端jsp,jsp访问服务器端mysql数据库,最终返回到客户端的中文出现乱码问题。 在整个流程中,出现错误的原因可能是三个:post未设置编码或者编码不相符合,jdbc出现问题,...

    基于某某平台的数据源迁移oracle -mysql

    三、mysql数据库的安装 4 四、数据库的创建并用客户端软件连接 5 1、创建数据库 5 2、应用 navicat连接mysql 数据库 6 五、某某系统下数据源的转换 7 1、某某系统下数据源的配置 7 2、jdbc.url 重要参数讲解 8 六、...

    乱码问题解决方案

    一、有关中文乱码: mysql部分: url配置:jdbc:mysql://localhost:3306/XXX?useUnicode=true&characterEncoding=utf8 jdbc:mysql://localhost:3306/XXX?useUnicode=true&characterEncoding=utf8 创建...

Global site tag (gtag.js) - Google Analytics