从 JDBC 驱动程序发送到服务器的所有字符串都将自动从本地 Java Unicode 形式转换为连接的字符编码,包括使用 Statement.execute()
、Statement.executeUpdate()
和 Statement.executeQuery()
发送的所有查询,以及所有 PreparedStatement
和 CallableStatement
参数,不包括 使用以下方法设置的参数
setBlob()
setBytes()
setClob()
setNClob()
setAsciiStream()
setBinaryStream()
setCharacterStream()
setNCharacterStream()
setUnicodeStream()
每个连接的编码数量
Connector/J 支持客户端和服务器之间单个字符编码,以及在 ResultSets
中从服务器返回到客户端的数据的任意数量的字符编码。
设置字符编码
对于 Connector/J 8.0.25 及更早版本: 客户端和服务器之间的字符编码在连接时自动检测(前提是 Connector/J 连接属性 characterEncoding
和 connectionCollation
未设置)。服务器上的编码使用系统变量 character_set_server
指定(有关更多信息,请参见 服务器字符集和排序规则),驱动程序会自动使用该编码。例如,要将 4 字节 UTF-8 字符集 与 Connector/J 一起使用,请使用 character_set_server=utf8mb4
配置 MySQL 服务器,并将 characterEncoding
和 connectionCollation
从 Connector/J 连接字符串中排除。然后,Connector/J 将自动检测 UTF-8 设置。要覆盖客户端上自动检测的编码,请在连接到服务器的连接 URL 中使用 characterEncoding
属性。
对于 Connector/J 8.0.26 及更高版本: 连接初始化期间有两个阶段会设置字符编码和排序规则。
-
身份验证前阶段: 在此阶段,客户端和服务器之间的字符编码由 Connector/J 连接属性的设置决定,优先级顺序如下
如果上述属性均未设置,则设置为
UTF8
(在 MySQL 服务器上对应于utf8mb4
)
-
身份验证后阶段:在此阶段,客户端和服务器之间的字符编码(用于会话的剩余时间)由 Connector/J 连接属性的设置决定,优先级顺序如下
如果上述属性均未设置,则设置为
UTF8
(在 MySQL 服务器上对应于utf8mb4
)
这意味着 Connector/J 需要发出 SET NAMES 语句 以更改仅在身份验证前阶段建立的字符集和排序规则,前提是
passwordCharacterEncoding
已设置,但其设置与connectionCollation
的设置不同,或者与characterEncoding
的设置不同(当connectionCollation
未设置时),或者与utf8mb4
不同(当connectionCollation
和characterEncoding
均未设置时)。
自定义字符集和排序规则
要支持在服务器上使用自定义字符集和排序规则,请将 Connector/J 连接属性 detectCustomCollations
设置为 true
,并通过使用 customCharsetMapping
连接属性提供带逗号分隔的
对列表(例如:custom_charset
:java_encoding
customCharsetMapping=charset1:UTF-8,charset2:Cp1252
)来提供自定义字符集和 Java 字符编码之间的映射。
MySQL 到 Java 编码名称翻译
在指定字符编码时使用 Java 风格的名称。下表列出了 MySQL 字符集名称及其对应的 Java 风格名称
表 6.21 MySQL 到 Java 编码名称翻译
MySQL 字符集名称 | Java 风格的字符编码名称 |
---|---|
ascii |
US-ASCII |
big5 |
Big5 |
gbk |
GBK |
sjis |
SJIS 或 Cp932 |
cp932 |
Cp932 或 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 |
utf8mb4 |
UTF-8 |
ucs2 |
UnicodeBig |
当
UTF-8
用于连接字符串中的characterEncoding
时,它会映射到 MySQL 字符集名称utf8mb4
。如果连接选项
connectionCollation
也与characterEncoding
一起设置,并且与它不兼容,则characterEncoding
将被与connectionCollation
相对应的编码覆盖。由于没有用于
utfmb3
的 Java 风格字符集名称,您可以在连接选项charaterEncoding
中使用它,因此,使用utf8mb3
作为连接字符集的唯一方法是使用连接选项connectionCollation
的utf8mb3
排序规则(例如,utf8_general_ci
),这会强制使用utf8mb3
字符集,如最后一项所述。
不要使用 Connector/J 发出 SET NAMES 查询,因为驱动程序将无法检测到该查询已更改字符集,并将继续使用在首次设置连接时配置的字符集。