对于从JDBC驱动程序发往服务器的所有字符串,均将自动地从固有放热Java Unicode形式转换为客户端字符编码,包括通过Statement.execute()、Statement.executeUpdate()和Statement.executeQuery()发出的所有查询,以及除了用setBytes()、setBinaryStream()、setAsiiStream()、setUnicodeStream()和setBlob()排除的参试之外的所有PreparedStatement和CallableStatement参数。
在MySQL服务器4.1之前,Connector/J支持每连接单一字符编码,能够从服务器配置自动检测到它,也能由用户通过使用useUnicode和characterEncoding属性配置它。
从MySQL服务器4.1版起,Connector/J支持客户端和服务器之间的但以字符编码,以及针对结果集中从服务器返回至客户端的数据的任意数目字符编码。
连接时将自动检测客户端和服务器之间的字符编码。对于由驱动程序使用的编码来说,它是在服务器上通过使用配置变量“character_set”(低于4.1.0的服务器版本)和“character_set_server”(4.1.0和更高的服务器版本)指定的。更多信息,请参见MySQL服务器手册中的服务器字符集和校对一节。
要想覆盖客户端上的自动检测编码功能,可在用于连接到服务器的URL中使用“characterEncoding”属性。
在客户端上指定字符编码时,应使用Java风格名称。在下面的表格中,列出了用于MySQL字符集的Java风格名称:
表26.4. MySQL对Java编码名称的翻译
| MySQL字符集名称 | Java风格字符编码名称 |
|---|---|
| usa7 | US-ASCII |
| big5 | Big5 |
| gbk | GBK |
| sjis | SJIS |
| gb2312 | EUC_CN |
| ujis | EUC_JP |
| euc_kr | EUC_KR |
| latin1 | ISO8859_1 |
| latin1_de | ISO8859_1 |
| german1 | ISO8859_1 |
| danish | ISO8859_1 |
| latin2 | ISO8859_2 |
| czech | ISO8859_2 |
| hungarian | ISO8859_2 |
| croat | ISO8859_2 |
| greek | ISO8859_7 |
| hebrew | ISO8859_8 |
| latin5 | ISO8859_9 |
| latvian | ISO8859_13 |
| latvian1 | ISO8859_13 |
| estonia | ISO8859_13 |
| dos | Cp437 |
| pclatin2 | Cp852 |
| cp866 | Cp866 |
| koi8_ru | KOI8_R |
| tis620 | TIS620 |
| win1250 | Cp1250 |
| win1250ch | Cp1250 |
| win1251 | Cp1251 |
| cp1251 | Cp1251 |
| win1251ukr | Cp1251 |
| cp1257 | Cp1257 |
| macroman | MacRoman |
| macce | MacCentralEurope |
| utf8 | UTF-8 |
| ucs2 | UnicodeBig |
不要用Connector/J发出查询“set names”,这是因为驱动程序不会检测已变化的字符集,而是会继续使用在初始连接设置中检测到的字符集。
为了允许从客户端发出的多个字符集,应使用“UTF-8”编码,方式是,将utf8配置为默认的服务器字符集,或通过“characterEncoding”属性配置JDBC驱动程序以使用“UTF-8”。