JDBC Driver使用的JDBC URL中关于字符编码的配置参数主要有两个:
useUnicode:是否使用自定义的编码方案
characterEncoding:指定的编码方案
一个具体的JDBC URL的例子如下:
jdbc:mysql://127.0.0.1:3306/dslztx?useUnicode=true&characterEncoding=utf8
这里的"characterEncoding"跟"Content-Type:application/json;charset=UTF-8"中的"charset"的作用类似,都是用来配置将字符流转换成字节流的时候所使用的编码方案,编码得到的字节流将在网络中传输
整个转换过程可以描绘成如下的步骤:
1)发送端使用配置的"characterEncoding"值,将字符流编码成字节流
2)将1)中得到的字节流通过网络传输到接收端
3)在接收端,已经预先接收获取发送端配置的"characterEncoding"值,利用该值,解码字节流,得到字符流
接下来,做几个实验:
1)
JDBC URL:jdbc:mysql://127.0.0.1:3306/dslztx?useUnicode=true&characterEncoding=gbk
SQL:INSERT INTO `Footer` (`ID`,`Value`) VALUES (1,'好');
过程:
Mysql连接中的数据截取图:
2)
JDBC URL:jdbc:mysql://127.0.0.1:3306/dslztx?useUnicode=true&characterEncoding=utf8
SQL:INSERT INTO `Footer` (`ID`,`Value`) VALUES (1,'好');
过程:
Mysql连接中的数据截取图:
3)
JDBC URL:jdbc:mysql://127.0.0.1:3306/dslztx?useUnicode=true&characterEncoding=gbk
SQL:INSERT INTO `Footer` (`ID`,`Value`) VALUES (1,'�');
过程:
Mysql连接中的数据截取图:
分析:
在GBK编码方案中,不能编码“�”字符,JDBC Driver自动以"0x3f"字节序列作为编码值(解决”不能编码字符“问题选用的是《编码解码模型和实现》[1]所描述的第二种解决方案)。
4)
JDBC URL:jdbc:mysql://127.0.0.1:3306/dslztx?useUnicode=true&characterEncoding=utf8
SQL:INSERT INTO `Footer` (`ID`,`Value`) VALUES (1,'�');
过程:
Mysql连接中的数据截取图:
备注:
JDBC Driver使用Tcp协议来作为Mysql连接使用的传输协议[2],因而可以通过"sudo tcpdump -X -i lo dst 127.0.0.1 and tcp port 3306"命令[3]来解析Mysql连接中传输的数据包
上面实验中的数据截取图就是通过该命令获得的
参考文献:
[1]http://blog.csdn.net/dslztx/article/details/48209827
[2]http://www.caucho.com/resin-4.0/admin/database.xtp
[3]http://www.51testing.com/html/78/22578-142353.html