3.5.7 使用字符集和 Unicode

从 JDBC 驱动程序发送到服务器的所有字符串都会自动从本机 Java Unicode 格式转换为客户端字符编码,包括使用 Statement.execute()Statement.executeUpdate()、 和 发送的所有查询Statement.executeQuery(),以及所有 PreparedStatementCallableStatement参数,不包括使用setBytes()setBinaryStream()setAsciiStream()setUnicodeStream()和 设置的参数setBlob()

每个连接的编码数

Connector/J 支持客户端和服务器之间的单一字符编码,以及服务器返回给客户端的任意数量的字符编码 ResultSets

设置字符编码

对于 Connector/J 8.0.25 及更早版本:连接时会自动检测客户端和服务器之间的字符编码(前提是 Connector/J 连接属性 characterEncodingconnectionCollation 设置)。服务器上的编码是使用系统变量指定的 character_set_server(有关更多信息,请参阅服务器字符集和排序规则),驱动程序会自动使用该编码。例如,要在 Connector/J 中使用 4 字节 UTF-8 字符集,请将 MySQL 服务器配置为 character_set_server=utf8mb4, 并保留 characterEncodingconnectionCollation 在 Connector/J 连接字符串之外。然后 Connector/J 将自动检测 UTF-8 设置。要覆盖客户端自动检测到的编码,请使用 characterEncoding 服务器连接 URL 中的属性。

对于 Connector/J 8.0.26 及更高版本:连接初始化期间有两个阶段,其中设置字符编码和排序规则。

自定义字符集和排序规则

仅适用于 Connector/J 8.0.26 及更高版本:要支持在服务器上使用自定义字符集和排序规则,请将 Connector/J 连接属性设置 detectCustomCollationstrue,并通过提供自定义字符集和 Java 字符编码之间的映射customCharsetMapping带有逗号分隔的 的 (例如:) 。 custom_charset:java_encodingcustomCharsetMapping=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 及更早版本utf8

对于 8.0.13 及更高版本utf8mb4

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

  • 如果连接选项 connectionCollationcharacterEncoding与它一起设置并且与其不兼容, characterEncoding则将被对应于 connectionCollation.

  • 因为没有 utfmb3可与连接选项一起使用的Java 样式字符集名称,用作连接字符集 charaterEncoding的唯一方法是对连接选项使用排序规则(例如, ),这会强制使用字符集要使用,如上一个项目符号中所述。 utf8mb3utf8mb3utf8_general_ci connectionCollationutf8mb3

警告

不要使用 Connector/J 发出查询SET NAMES,因为驱动程序不会检测到字符集已被查询更改,并将继续使用首次建立连接时配置的字符集。