从 JDBC 驱动程序发送到服务器的所有字符串都会自动从本机 Java Unicode 格式转换为客户端字符编码,包括使用
Statement.execute()
、
Statement.executeUpdate()
、 和
发送的所有查询Statement.executeQuery()
,以及所有
PreparedStatement
和
CallableStatement
参数,不包括使用setBytes()
、
setBinaryStream()
、
setAsciiStream()
、
setUnicodeStream()
和
设置的参数setBlob()
。
每个连接的编码数
Connector/J 支持客户端和服务器之间的单一字符编码,以及服务器返回给客户端的任意数量的字符编码
ResultSets
。
设置字符编码
对于 Connector/J 8.0.25 及更早版本:连接时会自动检测客户端和服务器之间的字符编码(前提是 Connector/J 连接属性
characterEncoding
未
connectionCollation
设置)。服务器上的编码是使用系统变量指定的
character_set_server
(有关更多信息,请参阅服务器字符集和排序规则),驱动程序会自动使用该编码。例如,要在 Connector/J 中使用
4 字节 UTF-8 字符集,请将 MySQL 服务器配置为
character_set_server=utf8mb4
, 并保留
characterEncoding
和
connectionCollation
在 Connector/J 连接字符串之外。然后 Connector/J 将自动检测 UTF-8 设置。要覆盖客户端自动检测到的编码,请使用
characterEncoding
服务器连接 URL 中的属性。
对于 Connector/J 8.0.26 及更高版本:连接初始化期间有两个阶段,其中设置字符编码和排序规则。
Pre-Authentication Phase:在这个阶段,客户端和服务器之间的字符编码由Connector/J连接属性的设置决定,优先级如下:
设置为
UTF8
(对应utf8mb4
于 MySQL 服务器),如果以上属性均未设置
身份验证后阶段:在此阶段,会话其余部分的客户端和服务器之间的字符编码由 Connector/J 连接属性的设置确定,优先级如下:
设置为
UTF8
(对应utf8mb4
于 MySQL 服务器),如果以上属性均未设置
这意味着Connector/J需要发布一个 SET NAMES Statement来更改在预认证阶段建立的字符集和排序规则只有当
passwordCharacterEncoding
设置了,但它的设置与的不同connectionCollation
,或者与characterEncoding
(当connectionCollation
是未设置)或不同于utf8mb4
(当两者connectionCollation
都未characterEncoding
设置时)。
自定义字符集和排序规则
仅适用于 Connector/J 8.0.26 及更高版本:要支持在服务器上使用自定义字符集和排序规则,请将 Connector/J 连接属性设置
detectCustomCollations
为true
,并通过提供自定义字符集和 Java 字符编码之间的映射customCharsetMapping
带有逗号分隔的
的
(例如:)
。
custom_charset
:java_encoding
customCharsetMapping=charset1:UTF-8,charset2:Cp1252
MySQL 到 Java 编码名称翻译
指定字符编码时使用 Java 风格的名称。下表列出了 MySQL 字符集名称及其对应的 Java 样式名称:
表 3.24 MySQL 到 Java 编码名称的转换
MySQL 字符集名称 | Java 风格的字符编码名称 |
---|---|
ascii |
US-ASCII |
big5 |
Big5 |
gbk |
GBK |
sjis |
SJIS or Cp932 |
cp932 |
Cp932 or MS932 |
gb2312 |
EUC_CN |
ujis |
EUC_JP |
euckr |
EUC_KR |
latin1 |
Cp1252 |
latin2 |
ISO8859_2 |
greek |
ISO8859_7 |
hebrew |
ISO8859_8 |
cp866 |
Cp866 |
tis620 |
TIS620 |
cp1250 |
Cp1250 |
cp1251 |
Cp1251 |
cp1257 |
Cp1257 |
macroman |
MacRoman |
macce |
MacCentralEurope |
对于 8.0.12 及更早版本:
对于 8.0.13 及更高版本:
|
UTF-8 |
ucs2 |
UnicodeBig |
对于 Connector/J 8.0.12 及更早版本:为了使用
utf8mb4
连接字符集,服务器必须配置为
character_set_server=utf8mb4
;如果不是这种情况,当UTF-8
中使用 forcharacterEncoding
时,它将映射到 MySQL 字符集名称
utf8
,它是 的别名
utf8mb3
。
对于连接器/J 8.0.13 及更高版本:
当
UTF-8
用于characterEncoding
连接字符串时,它映射到 MySQL 字符集名称utf8mb4
。如果连接选项
connectionCollation
也characterEncoding
与它一起设置并且与其不兼容,characterEncoding
则将被对应于connectionCollation
.因为没有
utfmb3
可与连接选项一起使用的Java 样式字符集名称,用作连接字符集charaterEncoding
的唯一方法是对连接选项使用排序规则(例如, ),这会强制使用字符集要使用,如上一个项目符号中所述。utf8mb3
utf8mb3
utf8_general_ci
connectionCollation
utf8mb3
不要使用 Connector/J 发出查询SET NAMES,因为驱动程序不会检测到字符集已被查询更改,并将继续使用首次建立连接时配置的字符集。