6.7 Использование наборов символов и Unicode
Все строки, отправляемые драйвером 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 не установлены). Кодировка на сервере задается с помощью системной переменной (подробнее см. ), и драйвер автоматически использует эту кодировку. Например, чтобы использовать с Connector/J, настройте сервер MySQL с , и оставьте characterEncoding и connectionCollation вне строки подключения Connector/J. Connector/J затем автоматически определит UTF-8. Чтобы переопределить автоматически обнаруженную кодировку на стороне клиента, используйте свойство characterEncoding в URL-адресе подключения к серверу.
Для Connector/J 8.0.26 и более поздних версий: Существует две фазы во время инициализации соединения, в которых устанавливаются кодировка символов и сортировка.
-
Предварительная фаза аутентификации: На этой фазе кодировка символов между клиентом и сервером определяется настройками свойств подключения Connector/J в порядке приоритета:
Установлено значение
UTF8(соответствуетutf8mb4на серверах MySQL), если ни одно из вышеперечисленных свойств не задано
-
Фаза после аутентификации: На этой фазе кодировка символов между клиентом и сервером для остальной части сеанса определяется настройками свойств подключения Connector/J в порядке приоритета:
Установлено значение
UTF8(соответствуетutf8mb4на серверах MySQL), если ни одно из вышеперечисленных свойств не задано
Это означает, что Connector/J должен выдать для изменения набора символов и сортировки, установленных на фазе предварительной аутентификации, только если
passwordCharacterEncodingустановлено, но его значение отличается от значенияconnectionCollation, или отличается от значенияcharacterEncoding(когдаconnectionCollationне установлено), или отличается отutf8mb4(когда обаconnectionCollationиcharacterEncodingне установлены).
Настраиваемые наборы символов и сортировки
Чтобы поддержать использование настраиваемых наборов символов и сортировок на сервере, установите свойство подключения Connector/J detectCustomCollations в значение true, и предоставьте отображение между настраиваемыми наборами символов и кодировками символов Java, указав свойство подключения customCharsetMapping со списком пар , разделенных запятыми (например: custom_charset:java_encodingcustomCharsetMapping=charset1:UTF-8,charset2:Cp1252).
Преобразования имен кодировок MySQL в Java
Используйте имена в стиле Java при указании кодировок символов. В следующей таблице перечислены имена наборов символов MySQL и соответствующие имена в стиле Java:
Таблица 6.21 Преобразования имен кодировок 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 |
utf8mb4 | UTF-8 |
ucs2 | UnicodeBig |
Когда
UTF-8используется дляcharacterEncodingв строке подключения, он отображается в имени набора символов MySQLutf8mb4.Если параметр подключения
connectionCollationтакже установлен наряду сcharacterEncodingи несовместим с ним,characterEncodingбудет переопределен кодировкой, соответствующейconnectionCollation.Поскольку нет имени набора символов в стиле Java для
utfmb3, которое можно использовать с параметром подключенияcharaterEncoding, единственный способ использоватьutf8mb3в качестве набора символов подключения — использовать сортировкуutf8mb3(например,utf8_general_ci) для параметра подключенияconnectionCollation, что принудительно заставляет использовать набор символовutf8mb3, как объясняется в последнем пункте.
Не отправляйте запрос с Connector/J, так как драйвер не обнаружит, что набор символов был изменён запросом, и продолжит использовать набор символов, настроенный при первом подключении.
© 2025 Oracle
Licensed under the GPLv2 License.