mysql的jdbc中的编码转换

今天,我的eclipse链接mysql终于又能正常地进行中文字符的操作了。

  String url = "jdbc:mysql://localhost:3306/category?useUnicode=true&characterEncoding=UTF-8";
Class.forName("com.mysql.jdbc.Driver"); 
String userName = "root"; 
String password = "***********";   
Connection con = DriverManager.getConnection(url,userName,password); 

就加了红色的那一部分代码就好了。我找了下面这篇博文,还算说得清楚。但也有不理解的地方,我的数据库用的是UTF-8编码,eclipse这个项目的text file encoding用的也是UTF-8,那么按下文中,不加红色部分,默认的也是UTF-8,那为什么对数据库插入中文会出现乱码呢,但显示数据库的中文不显示乱码。暂时,还没想清,先将下面这篇博文留着,等弄明白了或找到其他解释再来改。

转载:

java中原生态支持unicode,内存中的String对象都是unicode编码,对于从mysql获取的字符串数据,理所当然需要先转化为unicode才能被使用,因此从ResultSet中获取字符串列值时,jdbc需要知道当前字段的原始编码,即从mysql-server接收到的原始字节所对应的编码,才能正确的将其转化为unicode供程序使用,此文介绍jdbc是如何获取当前字段的原始编码的。



原始编码的获得流程如下:
首先,如果在链接字符串中设置了编码,则原始编码=所指定的编码,比如:
jdbc:mysql://127.0.0.1:3306/mysql?useUnicode=true&characterEncoding=utf8
那原始编码=utf8。


如果没有在在链接字符串中设置编码,则原始编码=NULL,并且建立链接后执行
SET character_set_results = NULL
表示不希望服务器执行任何的转换,即字段在mysql中是什么编码,接收到的就是什么编码。


如果在链接的使用过程中有"SET NAMES XXX",则原始编码=XXX。


当进行ResultSet.getString()时,如果当前原始编码不为空,则直接将原始byte[]从原始编码转换成String;如果当前原始编码未空,则用mysql返回的field信息中的字段编码作为原始编码,将原始byte[]从原始编码转换成String。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章