今天,我的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。