A.11 MySQL 5.7 FAQ: MySQL Китайские, японские и корейские наборы символов
Этот набор часто задаваемых вопросов составлен на основе опыта групп поддержки и разработки MySQL по обработке многочисленных запросов о проблемах с наборами символов CJK (китайские, японские и корейские).
- A.11.1. Какие наборы символов CJK доступны в MySQL?
- A.11.2. Я вставил символы CJK в свою таблицу. Почему при SELECT они отображаются как символы «?»?
- A.11.3. С какими проблемами следует ознакомиться при работе с китайским набором символов Big5?
- A.11.4. Почему происходит сбой преобразования японских наборов символов?
- A.11.5. Что мне делать, если я хочу преобразовать SJIS 81CA в cp932?
- A.11.6. Как MySQL представляет символ иены (¥)?
- A.11.7. С какими проблемами следует ознакомиться при работе с корейскими наборами символов в MySQL?
- A.11.8. Почему появляются сообщения об ошибке «Неверное значение строки»?
- A.11.9. Почему в моём графическом интерфейсе или браузере символы CJK отображаются неправильно в приложении, использующем Access, PHP или другой API?
- A.11.10. Я перешел на MySQL 5.7. Как можно вернуть поведение MySQL 4.0 в отношении наборов символов?
- A.11.11. Почему некоторые запросы LIKE и FULLTEXT с символами CJK завершаются ошибкой?
- A.11.12. Как узнать, доступен ли символ X во всех наборах символов?
- A.11.13. Почему строки CJK сортируются неправильно в Unicode? (I)
- A.11.14. Почему строки CJK сортируются неправильно в Unicode? (II)
- A.11.15. Почему MySQL отклоняет мои дополнительные символы?
- A.11.16. Следует ли использовать «CJKV» вместо «CJK»?
- A.11.17. Разрешает ли MySQL использование символов CJK в именах баз данных и таблиц?
- A.11.18. Где я могу найти переводы руководства MySQL на китайский, японский и корейский языки?
- A.11.19. Где я могу получить помощь по вопросам CJK и связанных проблем в MySQL?
|
A.11.1. |
Какие наборы символов CJK доступны в MySQL? |
|
Список наборов символов CJK может отличаться в зависимости от версии MySQL. Например, набор символов mysql> (Для получения дополнительной информации см. Раздел 24.3.2, «Таблица INFORMATION_SCHEMA CHARACTER_SETS».) MySQL поддерживает три варианта наборов символов GB (Guojia Biaozhun, или Национальный стандарт, или Упрощённый китайский), которые являются официальными в КНР: Иногда люди пытаются вставить символы Здесь мы пытаемся уточнить, какие именно символы являются допустимыми в
Также возможно хранение символов CJK в наборах символов Unicode, хотя доступные правила сортировки могут не сортировать символы так, как вы ожидаете:
Используемое правило сортировки для набора символов Unicode определяет возможность сортировки (то есть различения) символов в наборе:
Кроме того, различие символов не равнозначно их упорядочиванию в соответствии с правилами конкретного языка CJK. В настоящее время MySQL имеет только одно правило сортировки UCA для CJK, Сведения о правилах сортировки Unicode и их свойствах различия, включая свойства сортировки дополнительных символов, см. в Раздел 10.10.1, «Наборы символов Unicode». |
|
|
A.11.2. |
Я вставил символы CJK в свою таблицу. Почему |
|
Эта проблема обычно связана с настройкой MySQL, которая не соответствует настройкам программы-приложения или операционной системы. Ниже приведены некоторые распространённые шаги по исправлению этих проблем:
|
|
|
A.11.3. |
Какие проблемы следует учитывать при работе с набором символов Big5 для китайского языка? |
|
MySQL поддерживает набор символов Big5, который распространён в Гонконге и на Тайване (Китайская Республика). Набор символов MySQL Была подана заявка на добавление расширений |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
A.11.4. |
Почему происходит сбой преобразования наборов символов японского языка? |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MySQL поддерживает наборы символов В следующей таблице преобразований столбец
Теперь рассмотрим следующую часть таблицы.
Это означает, что MySQL преобразует |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
A.11.5. |
Что мне делать, если я хочу преобразовать SJIS |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Наш ответ: “?”. Это имеет недостатки, и многие предпочли бы «мягкое» преобразование, чтобы |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
A.11.6. |
Как MySQL представляет знак иены ( |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Проблема возникает, потому что некоторые версии японских наборов символов (как MySQL использует только одну версию описания стандарта JIS (Японские промышленные стандарты). В MySQL, |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
A.11.7. |
Какие проблемы следует учитывать при работе с корейскими наборами символов в MySQL? |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Теоретически, хотя было несколько версий набора символов EUC-KR (Extended Unix Code Korea), отмечена только одна проблема. Мы используем вариант EUC-KR “ASCII”, в котором код mysql> |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
A.11.8. |
Почему появляются сообщения об ошибке Incorrect string value? |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Для демонстрации проблемы создайте таблицу с одним столбцом Unicode ( mysql> В режиме SQL без жёстких ограничений попробуйте поместить редкий символ mysql> mysql> Таким образом, это предупреждение только о столбце mysql> SELECT ucs2,HEX(ucs2),gb2312,HEX(gb2312) FROM ch;
+-------+--------------+--------+-------------+
| ucs2 | HEX(ucs2) | gb2312 | HEX(gb2312) |
+-------+--------------+--------+-------------+
| A汌B | 00416C4C0042 | A?B | 413F42 |
+-------+--------------+--------+-------------+
Здесь требуется несколько объяснений:
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
A.11.9. |
Почему в вашем приложении, использующем Access, PHP или другой API, CJK-символы отображаются неправильно в пользовательском интерфейсе или браузере? |
|
Получите прямое подключение к серверу с помощью клиента mysql и попробуйте тот же запрос там. Если mysql отвечает правильно, проблема может быть в том, что интерфейс вашего приложения требует инициализации. Используйте mysql, чтобы узнать, какой набор символов или наборы символов он использует с оператором <%
Session.CodePage=0
Dim strConnection
Dim Conn
strConnection="driver={MySQL ODBC 3.51 Driver};server= Точно так же, если вы используете любой набор символов, кроме Если вы используете PHP, попробуйте следующее: <?php
$link = new mysqli($host, $usr, $pwd, $db);
if( mysqli_connect_errno() )
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$link->query("SET NAMES 'utf8'");
?>
В этом случае мы использовали Другая проблема, часто встречающаяся в приложениях PHP, связана с предположениями, которые делает браузер. Иногда добавление или изменение тега Если вы используете Connector/J, см. . |
|
|
A.11.10. |
Я обновился до MySQL 5.7. Как я могу вернуться к поведению, подобному MySQL 4.0, в отношении наборов символов? |
|
В MySQL версии 4.0 был единственный “глобальный” набор символов для сервера и клиента, и решение о том, какой набор символов использовать, принимал администратор сервера. Это изменилось начиная с MySQL версии 4.1. Теперь происходит “рукопожатие”, как описано в разделе 10.4, «Наборы символов и кодовые страницы подключения»:
Это означает, что вы не можете контролировать набор символов клиента, запуская mysqld с Например, предположим, что ваш любимый набор символов сервера — mysqld --character-set-server=latin1
А затем запустите клиент с набором символов по умолчанию mysql --default-character-set=utf8
Результаты можно увидеть, просмотрев вывод mysql> Теперь остановите клиент и сервер, используя mysqladmin. Затем запустите сервер снова, но на этот раз попросите его пропустить рукопожатие: mysqld --character-set-server=utf8 --skip-character-set-client-handshake
Запустите клиент с mysql> Как видно из различных результатов |
|
|
A.11.11. |
Почему некоторые поиски |
|
Для поисков +-------------------------+---------------------------+
| OCTET_LENGTH(_utf8 'A') | OCTET_LENGTH(_utf8 'ペ') |
+-------------------------+---------------------------+
| 1 | 3 |
+-------------------------+---------------------------+
Если мы не знаем, где заканчивается первый символ в строке, мы не знаем, где начинается второй символ, в этом случае даже очень простые запросы, такие как Это одна из причин, по которой MySQL не может допускать кодировки несуществующих символов. Если он не строг в отношении отклонения некорректного ввода, он не может определить, где заканчиваются символы. Для |
|
|
A.11.12. |
Как узнать, доступен ли символ |
|
Большинство упрощённых китайских и базовых неполноширинных японских кана встречаются во всех наборах символов CJK. Следующая хранимая процедура принимает символ Unicode DELIMITER //
CREATE PROCEDURE p_convert(ucs2_char CHAR(1) CHARACTER SET ucs2)
BEGIN
CREATE TABLE tj
(ucs2 CHAR(1) character set ucs2,
utf8 CHAR(1) character set utf8,
big5 CHAR(1) character set big5,
cp932 CHAR(1) character set cp932,
eucjpms CHAR(1) character set eucjpms,
euckr CHAR(1) character set euckr,
gb2312 CHAR(1) character set gb2312,
gbk CHAR(1) character set gbk,
sjis CHAR(1) character set sjis,
ujis CHAR(1) character set ujis);
INSERT INTO tj (ucs2) VALUES (ucs2_char);
UPDATE tj SET utf8=ucs2,
big5=ucs2,
cp932=ucs2,
eucjpms=ucs2,
euckr=ucs2,
gb2312=ucs2,
gbk=ucs2,
sjis=ucs2,
ujis=ucs2;
/* If there are conversion problems, UPDATE produces warnings. */
SELECT hex(ucs2) AS ucs2,
hex(utf8) AS utf8,
hex(big5) AS big5,
hex(cp932) AS cp932,
hex(eucjpms) AS eucjpms,
hex(euckr) AS euckr,
hex(gb2312) AS gb2312,
hex(gbk) AS gbk,
hex(sjis) AS sjis,
hex(ujis) AS ujis
FROM tj;
DROP TABLE tj;
END//
DELIMITER ;
Вход может быть любым одиночным mysql> Поскольку ни одно из значений столбца не равно |
|
|
A.11.13. |
Почему строки CJK сортируются неправильно в Unicode? (I) |
|
Примечание
Описанные здесь проблемы сортировки CJK могут возникать в версиях MySQL, предшествующих MySQL 8.0. Начиная с MySQL 8.0, их можно решить, используя кодировку Иногда пользователи замечают, что результат поиска
Для обработки новых версий UCA мы создаем новые сортировки. Мы очень осторожны в отношении изменения порядка существующих сортировок, поскольку это влияет на индексы, что может привести к ситуациям, подобным описанной в ошибке #16526, которая показана следующим образом: mysql> Символ в первой строке результата не тот, который мы искали. Почему MySQL вернул его? Сначала мы ищем значение кодовой точки Unicode, что возможно, прочитав шестнадцатеричное число для mysql> Теперь мы ищем 304B ; [.1E57.0020.000E.304B] # HIRAGANA LETTER KA
304C ; [.1E57.0020.000E.304B][.0000.0140.0002.3099] # HIRAGANA LETTER GA; QQCM
Официальные имена Unicode (после метки “#”) сообщают нам о японском слоговом письме (Hiragana), неофициальной классификации (буква, цифра или знак препинания) и западном идентификаторе ( |
|
|
A.11.14. |
Почему строки CJK сортируются неправильно в Unicode? (II) |
|
Примечание
Описанные здесь проблемы сортировки CJK могут возникать в версиях MySQL, предшествующих MySQL 8.0. Начиная с MySQL 8.0, их можно решить, используя кодировку Если вы используете Unicode ( mysql> Поскольку кодировка для столбца mysql> (См. Раздел 24.3.5, «Таблица INFORMATION_SCHEMA COLUMNS» для получения дополнительной информации.) Вы можете видеть, что сортировка — это mysql> Для |
|
|
A.11.15. |
Почему мои дополнительные символы отклоняются MySQL? |
|
Дополнительные символы находятся за пределами базовой многоязыковой плоскости/плоскости 0 Unicode. Символы BMP имеют значения кодовых точек от Для хранения дополнительных символов необходимо использовать кодировку, которая их поддерживает:
|
|
|
A.11.16. |
Должно ли “CJK” быть “CJKV”? |
|
Нет. Термин “CJKV” (китайский японский корейский вьетнамский) относится к вьетнамским кодировкам, которые содержат иероглифы Хан (первоначально китайские). MySQL поддерживает современный вьетнамский алфавит с западными символами, но не поддерживает старый вьетнамский алфавит с использованием иероглифов Хан. Начиная с MySQL 5.6, существуют вьетнамские сортировки для кодировок Unicode, как описано в Разделе 10.10.1, «Кодировки Unicode». |
|
|
A.11.17. |
Разрешает ли MySQL использование символов CJK в именах баз данных и таблиц? |
Да. |
|
|
A.11.18. |
Где я могу найти переводы руководства MySQL на китайский, японский и корейский языки? |
Японский перевод руководства MySQL 5.6 можно загрузить с https://dev.mysql.com/doc/. |
|
|
A.11.19. |
Где я могу получить помощь по проблемам CJK и связанным с ними проблемам в MySQL? |
|
Доступны следующие ресурсы:
|
© 2025 Oracle
Licensed under the GPLv2 License.