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。