Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  MySQL 8.4 Frequently Asked Questions  /  MySQL 8.4 FAQ: MySQL Chinese, Japanese, and Korean Character Sets

A.11 MySQL 8.4 常见问题解答:MySQL 中日韩字符集

这组常见问题来自 MySQL 的支持和开发团队处理许多关于 CJK(中文-日文-韩文)问题的经验。

A.11.1. MySQL 中有哪些 CJK 字符集可用?
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. 为什么我的 GUI 前端或浏览器在我的应用程序中无法正确显示 CJK 字符?
A.11.10. 我已经升级到 MySQL 8.4。如何恢复到 MySQL 4.0 中的字符集行为?
A.11.11. 为什么某些 LIKE 和 FULLTEXT 搜索与 CJK 字符失败?
A.11.12. 如何知道某个字符是否在所有字符集中可用?
A.11.13. 为什么 CJK 字符串在 Unicode 中排序不正确?(I)
A.11.14. 为什么 CJK 字符串在 Unicode 中排序不正确?(II)
A.11.15. 为什么我的补充字符被 MySQL 拒绝?
A.11.16. 是否应该将“CJK”改为“CJKV”?
A.11.17. MySQL 是否允许在数据库和表名中使用 CJK 字符?
A.11.18. 哪里可以找到 MySQL 手册的中文、日文和韩文翻译?
A.11.19. 哪里可以获取 MySQL 中 CJK 相关问题的帮助?

A.11.1.

A.11.1. MySQL 中有哪些 CJK 字符集可用?

CJK 字符集的列表可能取决于您的 MySQL 版本。例如,gb18030 字符集在 MySQL 5.7.4 之前不受支持。然而,因为适用语言的名称出现在 DESCRIPTION 列中每个条目 INFORMATION_SCHEMA.CHARACTER_SETS 表中,因此您可以使用以下查询获取当前所有非 Unicode CJK 字符集的列表:

mysql> SELECT CHARACTER_SET_NAME, DESCRIPTION
       FROM INFORMATION_SCHEMA.CHARACTER_SETS
       WHERE DESCRIPTION LIKE '%Chin%'
       OR DESCRIPTION LIKE '%Japanese%'
       OR DESCRIPTION LIKE '%Korean%'
       ORDER BY CHARACTER_SET_NAME;
+--------------------+---------------------------------+
| CHARACTER_SET_NAME | DESCRIPTION                     |
+--------------------+---------------------------------+
| big5               | Big5 Traditional Chinese        |
| cp932              | SJIS for Windows Japanese       |
| eucjpms            | UJIS for Windows Japanese       |
| euckr              | EUC-KR Korean                   |
| gb18030            | China National Standard GB18030 |
| gb2312             | GB2312 Simplified Chinese       |
| gbk                | GBK Simplified Chinese          |
| sjis               | Shift-JIS Japanese              |
| ujis               | EUC-JP Japanese                 |
+--------------------+---------------------------------+

(更多信息,请参阅 第 28.3.4 节,“INFORMATION_SCHEMA CHARACTER_SETS 表”。)

MySQL 支持三种 GB(国标,或 国家标准,或 简体中文) 字符集,它们是中华人民共和国的官方字符集:gb2312gbk 和(从 MySQL 5.7.4 开始)gb18030

有时人们尝试将 gbk 字符插入 gb2312 中,并且大多数情况下都可以工作,因为 gbkgb2312 的超集。但是,最后他们尝试插入一个罕见的中文字符时就会失败。(例如,参阅 Bug #16072。)

在这里,我们尝试明确地说明 gb2312gbk 中哪些字符是合法的,以官方文档为参考。请在报告 gb2312gbk 错误之前检查这些参考文献:

也可以在 Unicode 字符集中存储 CJK 字符,尽管可用的排序规则可能不会按预期排序:

  • 字符集 utf8ucs2 支持 Unicode 基本多语言平面(BMP)中的字符。这些字符的代码点值在 U+0000U+FFFF 之间。

  • 字符集 utf8mb4utf16utf16leutf32 支持 BMP 字符,以及超出 BMP 的补充字符。这些补充字符的代码点值在 U+10000U+10FFFF 之间。

用于 Unicode 字符集的排序规则确定了字符的可区分性:

  • 基于 Unicode 排序算法(UCA)4.0.0 的排序规则仅区分 BMP 字符。

  • 基于 UCA 5.2.0 或 9.0.0 的排序规则区分 BMP 和补充字符。

  • 非 UCA 排序规则可能无法区分所有 Unicode 字符。例如,utf8mb4 的默认排序规则是 utf8mb4_general_ci,它仅区分 BMP 字符。

此外,区分字符与按照某种 CJK 语言的惯例排序不同。目前,MySQL 只有一个 CJK 特定的 UCA 排序规则,gb18030_unicode_520_ci(需要使用非 Unicode gb18030 字符集)。

有关 Unicode 排序规则和它们的区分特性的信息,请参阅 第 12.10.1 节,“Unicode 字符集”

A.11.2.

我已经将 CJK 字符插入了我的表中。为什么 SELECT 显示它们为 ? 字符?

这个问题通常是由于 MySQL 的设置与应用程序或操作系统的设置不匹配。以下是一些常见的解决步骤:

  • 确保您知道自己使用的是哪个 MySQL 版本

    使用语句 SELECT VERSION(); 来确定这个版本。

  • 确保数据库实际使用的是所需的字符集.

    人们经常认为客户端字符集总是与服务器字符集或显示目的字符集相同。但是,这两种假设都是错误的。你可以通过检查SHOW CREATE TABLE tablename的结果来确保,或者使用以下语句:

    SELECT character_set_name, collation_name
        FROM information_schema.columns
        WHERE table_schema = your_database_name
            AND table_name = your_table_name
            AND column_name = your_column_name;
  • 确定无法正确显示的字符或字符的十六进制值.

    你可以使用以下查询来获取表table_name中的列column_name的信息:

    SELECT HEX(column_name)
    FROM table_name;

    3F?字符的编码;这意味着?是实际存储在列中的字符。这通常是由于客户端字符集到目标字符集的转换问题。

  • 确保可以进行圆trip。选择literal(或_introducer hexadecimal-value),你是否获得literal作为结果

    例如,日语片假名字符Pe(ペ')存在于所有CJK字符集中,并且具有代码点值(十六进制编码)0x30da。要测试这个字符的圆trip,使用以下查询:

    SELECT 'ペ' AS `ペ`;         /* or SELECT _ucs2 0x30da; */

    如果结果不是也,那么圆trip失败。

    对于这种失败的错误报告,我们可能会要求你跟进SELECT HEX('ペ');。然后我们可以确定客户端编码是否正确。

  • 确保问题不在浏览器或其他应用程序,而是与MySQL

    使用mysql客户端程序来完成这项任务。如果mysql正确地显示字符,但你的应用程序不正确,那么你的问题可能是由于系统设置。

    要确定你的设置,使用SHOW VARIABLES语句,其输出应该类似于以下内容:

    mysql> SHOW VARIABLES LIKE 'char%';
    +--------------------------+----------------------------------------+
    | Variable_name            | Value                                  |
    +--------------------------+----------------------------------------+
    | character_set_client     | utf8                                   |
    | character_set_connection | utf8                                   |
    | character_set_database   | latin1                                 |
    | character_set_filesystem | binary                                 |
    | character_set_results    | utf8                                   |
    | character_set_server     | latin1                                 |
    | character_set_system     | utf8                                   |
    | character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ |
    +--------------------------+----------------------------------------+

    这些是国际化客户端的典型字符集设置(注意使用utf8 Unicode),连接到西方服务器(latin1是西欧字符集)。

    虽然Unicode(通常是Unix上的utf8变体,Windows上的ucs2变体)是可取的,但它并不总是操作系统实用程序支持的最好选择。许多Windows用户发现,Microsoft字符集,如cp932用于日本Windows,是合适的。

    如果你无法控制服务器设置,并且不知道你的计算机使用什么设置,尝试更改为你所在国家的常见字符集(euckr = 韩国;gb18030gb2312gbk = 中国;big5 = 台湾;sjisujiscp932eucjpms = 日本;ucs2utf8 = 任何地方)。通常只需要更改客户端和连接设置。SET NAMES语句可以同时更改三个设置。例如:

    SET NAMES 'big5';

    一旦设置正确,你可以通过编辑my.cnfmy.ini使其永久化。例如,你可能会添加以下行:

    [mysqld]
    character-set-server=big5
    [client]
    default-character-set=big5

    也可能是API配置设置的问题;见为什么我的GUI前端或浏览器不能正确显示CJK字符...?以获取更多信息。

A.11.3.

使用Big5中文字符集时需要注意什么问题?

MySQL支持Big5字符集,它是香港和台湾(中华人民共和国)常用的字符集。MySQL的big5字符集实际上是Microsoft代码页950,它与原始big5字符集非常相似。

有人请求添加HKSCS扩展;见Bug #13577的补丁。

A.11.4.

为什么日语字符集转换失败?

MySQL支持sjisujiscp932eucjpms字符集,以及Unicode。一个常见的需求是之间的字符集转换。例如,可能有一个Unix服务器(通常使用sjisujis)和一个Windows客户端(通常使用cp932)。

在以下转换表中,ucs2列表示源,sjiscp932ujiseucjpms列表示目标;也就是说,最后4列提供了十六进制结果,当我们使用CONVERT(ucs2)或将ucs2列包含的值分配给sjiscp932ujiseucjpms列时。

字符名称 ucs2 sjis cp932 ujis eucjpms
断裂竖线 00A6 3F 3F 8FA2C3 3F
全宽断裂竖线 FFE4 3F FA55 3F 8FA2
日元符号 00A5 3F 3F 20 3F
全宽日元符号 FFE5 818F 818F A1EF 3F
波浪号 007E 7E 7E 7E 7E
上划线 203E 3F 3F 20 3F
水平竖线 2015 815C 815C A1BD A1BD
EM破折号 2014 3F 3F 3F 3F
反斜杠 005C 815F 5C 5C 5C
全宽反斜杠 FF3C 3F 815F 3F A1C0
波浪破折号 301C 8160 3F A1C1 3F
全宽波浪号 FF5E 3F 8160 3F A1C1
双竖线 2016 8161 3F A1C2 3F
平行于 2225 3F 8161 3F A1C2
减号 2212 817C 3F A1DD 3F
全宽连字符破折号 FF0D 3F 817C 3F A1DD
分币符号 00A2 8191 3F A1F1 3F
全宽分币符号 FFE0 3F 8191 3F A1F1
英镑符号 00A3 8192 3F A1F2 3F
全宽英镑符号 FFE1 3F 8192 3F A1F2
非符号 00AC 81CA 3F A2CC 3F
全宽非符号 FFE2 3F 81CA 3F A2CC

现在考虑表的以下部分。

ucs2 sjis cp932
非符号 00AC 81CA 3F
全宽非符号 FFE2 3F 81CA

这意味着MySQL将NOT SIGN(Unicode U+00AC)转换为sjis代码点0x81CA,并将其转换为cp932代码点3F。(3F是问号(?。这是在无法执行转换时总是使用的。)

A.11.5。

如果我想将SJIS 81CA转换为cp932,我该怎么做?

我们的回答是:?。这有缺点,许多人更喜欢“宽松”转换,以便81CA (NOT SIGN)sjis中变为81CA (FULLWIDTH NOT SIGN)cp932中。

A.11.6。

MySQL如何表示日元符号(¥)?

出现问题,因为一些版本的日本字符集(包括sjiseuc)将5C视为反斜杠(\,也称为反斜杠),而其他版本将其视为日元符号(¥)。

MySQL遵循JIS(日本工业标准)标准描述。在MySQL中,5C总是反斜杠(\

A.11.7。

在MySQL中使用韩国字符集时,我需要注意什么问题?

理论上,虽然有多个版本的euckr(扩展Unix代码韩国)字符集,但只有一个问题被注意到。我们使用ASCII变体的EUC-KR,在其中代码点0x5c是反斜杠(\),而不是韩元符号()。这意味着您不能将Unicode U+20A9转换为euckr

mysql> SELECT
           CONVERT('₩' USING euckr) AS euckr,
           HEX(CONVERT('₩' USING euckr)) AS hexeuckr;
+-------+----------+
| euckr | hexeuckr |
+-------+----------+
| ?     | 3F       |
+-------+----------+

A.11.8。

为什么我会收到Incorrect string value错误信息?

要看到问题,创建一个具有一个Unicode(ucs2)列和一个中文(gb2312)列的表。

mysql> CREATE TABLE ch
       (ucs2 CHAR(3) CHARACTER SET ucs2,
       gb2312 CHAR(3) CHARACTER SET gb2312);

在非严格SQL模式下,尝试将罕见字符放入两个列中。

mysql> SET sql_mode = '';
mysql> INSERT INTO ch VALUES ('A汌B','A汌B');
Query OK, 1 row affected, 1 warning (0.00 sec)

插入语句产生警告。使用以下语句来查看是什么:

mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
  Level: Warning
   Code: 1366
Message: Incorrect string value: '\xE6\xB1\x8CB' for column 'gb2312' at row 1

因此,它是一个关于gb2312列的警告。

mysql> SELECT ucs2,HEX(ucs2),gb2312,HEX(gb2312) FROM ch;
+-------+--------------+--------+-------------+
| ucs2  | HEX(ucs2)    | gb2312 | HEX(gb2312) |
+-------+--------------+--------+-------------+
| A汌B | 00416C4C0042 | A?B    | 413F42      |
+-------+--------------+--------+-------------+

这里需要解释几件事:

  1. 字符不在gb2312字符集中,如前所述。

  2. 如果您使用的是旧版本的MySQL,您可能会看到不同的消息。

  3. 警告而不是错误,因为MySQL不是在严格SQL模式下。在非严格模式下,MySQL尝试尽力而为,而不是放弃。使用严格SQL模式时,Incorrect string value消息将作为错误而不是警告,并且插入语句将失败。

A.11.9。

为什么我的GUI前端或浏览器在使用Access、PHP或另一个API时无法正确显示CJK字符?

使用mysql客户端直接连接到服务器,并尝试相同的查询。如果mysql正确响应,问题可能是您的应用程序接口需要初始化。使用mysql告诉您它使用的字符集或字符集集,使用语句SHOW VARIABLES LIKE 'char%';。如果您使用 Access,您可能正在使用 Connector/ODBC 连接。在这种情况下,您应该检查配置 Connector/ODBC。如果例如您使用big5,您将输入SET NAMES 'big5'。(在这种情况下,不需要;字符。)如果您使用 ASP,您可能需要在代码中添加SET NAMES。以下是一个曾经成功的示例:

<%
Session.CodePage=0
Dim strConnection
Dim Conn
strConnection="driver={MySQL ODBC 3.51 Driver};server=server;uid=username;" \
               & "pwd=password;database=database;stmt=SET NAMES 'big5';"
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open strConnection
%>

同样,如果您使用 Connector/NET 连接到任何字符集,而不是latin1,您必须在连接字符串中指定字符集。请参阅Connector/NET 连接,以获取更多信息。

如果您使用 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'");
?>

在这种情况下,我们使用SET NAMES更改character_set_clientcharacter_set_connectioncharacter_set_results

另一个经常在 PHP 应用程序中遇到的问题是浏览器的假设。有时添加或更改 标签就足以解决问题:例如,要确保用户代理将页面内容解释为UTF-8,请在 HTML 页面的部分包含<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

如果您使用 Connector/J,请参阅使用字符集和 Unicode

A.11.10.

我已经升级到 MySQL 8.4。如何恢复到 MySQL 4.0 中的字符集行为?

在 MySQL 版本 4.0 中,有一个单一的“全局”字符集,用于服务器和客户端,服务器管理员决定使用哪个字符集。从 MySQL 版本 4.1 开始,这种情况发生了变化。现在是一个“握手”,如第 12.4 节,“连接字符集和排序”所述:

当客户端连接时,它将要使用的字符集名称发送到服务器。服务器使用名称来设置character_set_clientcharacter_set_resultscharacter_set_connection系统变量。实际上,服务器执行了一个SET NAMES操作,使用字符集名称。

这种效果是,您不能通过启动 mysqld 使用 --character-set-server=utf8 来控制客户端字符集。然而,一些亚洲客户更喜欢 MySQL 4.0 的行为。为了使这种行为可能,我们添加了一个 mysqld 开关, --character-set-client-handshake,可以使用 --skip-character-set-client-handshake 关闭。如果您使用 --skip-character-set-client-handshake 启动 mysqld,那么,当客户端连接时,它会将要使用的字符集名称发送到服务器。但是,服务器将忽略客户端的请求

例如,假设您的默认服务器字符集是 latin1。假设客户端使用 utf8,因为这是客户端操作系统支持的。使用 latin1 作为默认字符集启动服务器:

mysqld --character-set-server=latin1

然后,使用默认字符集 utf8 启动客户端:

mysql --default-character-set=utf8

结果设置可以通过查看 SHOW VARIABLES 的输出来查看:

mysql> SHOW VARIABLES LIKE 'char%';
+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | utf8                                   |
| character_set_connection | utf8                                   |
| character_set_database   | latin1                                 |
| character_set_filesystem | binary                                 |
| character_set_results    | utf8                                   |
| character_set_server     | latin1                                 |
| character_set_system     | utf8                                   |
| character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ |
+--------------------------+----------------------------------------+

现在停止客户端,使用 mysqladmin 停止服务器。然后,再次启动服务器,但这次告诉它跳过握手,如下所示:

mysqld --character-set-server=utf8 --skip-character-set-client-handshake

再次使用 utf8 作为默认字符集启动客户端,然后显示结果:

mysql> SHOW VARIABLES LIKE 'char%';
+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | latin1                                 |
| character_set_connection | latin1                                 |
| character_set_database   | latin1                                 |
| character_set_filesystem | binary                                 |
| character_set_results    | latin1                                 |
| character_set_server     | latin1                                 |
| character_set_system     | utf8                                   |
| character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ |
+--------------------------+----------------------------------------+

通过比较 SHOW VARIABLES 的不同结果,可以看到,如果使用 --skip-character-set-client-handshake 选项,服务器将忽略客户端的初始设置。

A.11.11.

为什么一些 LIKEFULLTEXT 搜索使用 CJK 字符失败?

对于 LIKE 搜索,有一个非常简单的问题与二进制字符串列类型相关,例如 BINARYBLOB:我们必须知道字符在哪里结束。使用多字节字符集时,不同的字符可能具有不同的八位字节长度。例如,在 utf8 中,A 需要一个字节,但 需要三个字节,如下所示:

+-------------------------+---------------------------+
| OCTET_LENGTH(_utf8 'A') | OCTET_LENGTH(_utf8 'ペ') |
+-------------------------+---------------------------+
|                       1 |                         3 |
+-------------------------+---------------------------+

如果我们不知道字符串中的第一个字符在哪里结束,我们不知道第二个字符从哪里开始,这样简单的搜索,如 LIKE '_A%' 都会失败。解决方案是使用非二进制字符串列类型,定义为具有适当的 CJK 字符集。例如:mycol TEXT CHARACTER SET sjis。或者,在比较之前将其转换为 CJK 字符集。

这是 MySQL 无法允许不存在字符编码的原因之一。如果它不严格地拒绝坏输入,那么它不知道字符在哪里结束。

对于 FULLTEXT 搜索,我们必须知道单词的开始和结束。使用西方语言,这通常不是问题,因为大多数(如果不是所有)西方语言都使用易于识别的单词边界:空格字符。然而,这通常不是亚洲语言的情况。我们可以使用任意的中间措施,例如假设所有汉字代表单词,或者(对于日本语)依赖于语法结束的 Katakana 到 Hiragana 的变化。然而,唯一确定的解决方案需要一个综合的单词列表,这意味着我们需要在服务器中包含每种亚洲语言的词典。这根本不可行。

A.11.12.

如何知道字符 X 是否在所有字符集中可用?

大多数简体中文和基本非半宽日文假名字符出现在所有CJK字符集中。以下存储过程接受一个 UCS-2 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 ;

输入可以是任何单个 ucs2 字符,也可以是该字符的代码值(十六进制表示)。例如,从Unicode的 ucs2 编码和名称列表(http://www.unicode.org/Public/UNIDATA/UnicodeData.txt),我们知道,片假名字符 Pe 出现在所有CJK字符集中,其代码值为 X'30DA'。如果我们使用这个值作为 p_convert() 的参数,结果如下所示:

mysql> CALL p_convert(X'30DA');
+------+--------+------+-------+---------+-------+--------+------+------+------+
| ucs2 | utf8   | big5 | cp932 | eucjpms | euckr | gb2312 | gbk  | sjis | ujis |
+------+--------+------+-------+---------+-------+--------+------+------+------+
| 30DA | E3839A | C772 | 8379  | A5DA    | ABDA  | A5DA   | A5DA | 8379 | A5DA |
+------+--------+------+-------+---------+-------+--------+------+------+------+

由于没有列值是 3F(即问号字符,),我们知道每个转换都成功了。

A.11.13。

为什么CJK字符串在Unicode中排序不正确?(I)

CJK排序问题在旧版本的MySQL中可以通过使用 utf8mb4 字符集和 utf8mb4_ja_0900_as_cs 排序解决。

A.11.14。

为什么CJK字符串在Unicode中排序不正确?(II)

CJK排序问题在旧版本的MySQL中可以通过使用 utf8mb4 字符集和 utf8mb4_ja_0900_as_cs 排序解决。

A.11.15。

为什么我的补充字符被MySQL拒绝?

补充字符位于Unicode 基本多语言平面 / 平面 0 之外。BMP 字符具有代码点值介于 U+0000U+FFFF 之间。补充字符具有代码点值介于 U+10000U+10FFFF 之间。

要存储补充字符,必须使用支持它们的字符集:

  • 字符集 utf8ucs2 仅支持BMP字符。

    字符集 utf8 仅允许最多三个字节的 UTF-8 字符。这导致了 Bug #12600 的报告,我们将其拒绝为 不是bug。使用 utf8 时,MySQL 必须截断输入字符串,以便在遇到不理解的字节时不知道坏的多字节字符有多长。

    一种可能的解决方法是使用 ucs2 而不是 utf8,在这种情况下,坏字符将被更改为问号。但是,不会截断。您也可以将数据类型更改为 BLOBBINARY,它们不执行有效性检查。

  • 字符集 utf8mb4utf16utf16leutf32 支持BMP字符,以及BMP之外的补充字符。

A.11.16。

是否应该将“CJK”改为“CJKV”?

不。术语“CJKV”(Chinese Japanese Korean Vietnamese)指的是越南字符集,其中包含汉字符(最初来自中国)。MySQL支持使用西方字符的现代越南脚本,但不支持使用汉字符的旧越南脚本。

从MySQL 5.6开始,有越南排序规则的Unicode字符集,如 第 12.10.1 节,“Unicode 字符集” 所述。

A.11.17。

MySQL 是否允许在数据库和表名中使用CJK字符?

是。

A.11.18。

哪里可以找到MySQL手册的中文、日文和韩文翻译?

MySQL 5.6 手册的日文翻译可以从 https://dev.mysql.com/doc/ 下载。

A.11.19。

哪里可以获取MySQL中的CJK相关问题帮助?

以下资源可用: