文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  MySQL 8.4 常见问题解答  /  MySQL 8.4 常见问题解答:MySQL 中日韩字符集

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. 为什么我会收到 Incorrect string value 错误消息?
A.11.9. 为什么我的 GUI 前端或浏览器在我的使用 Access、PHP 或其他 API 的应用程序中不正确地显示 CJK 字符?
A.11.10. 我已升级到 MySQL 8.4。如何恢复到 MySQL 4.0 中关于字符集的行为?
A.11.11. 为什么一些使用 CJK 字符的 LIKE 和 FULLTEXT 搜索失败?
A.11.12. 如何知道字符 X 是否在所有字符集中都可用?
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.

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

CJK 字符集列表可能因您的 MySQL 版本而异。例如,gb18030 字符集在 MySQL 5.7.4 之前不受支持。但是,由于 INFORMATION_SCHEMA.CHARACTER_SETS 表中每个条目中的 DESCRIPTION 列都显示了适用语言的名称,因此您可以使用以下查询获取所有非 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 (Guojia Biaozhun,或 国家标准,或 简体中文) 字符集:gb2312gbk 和(从 MySQL 5.7.4 开始)gb18030

有时人们会尝试将 gbk 字符插入 gb2312,并且大部分时间它都能正常工作,因为 gbkgb2312 的超集。但最终他们会尝试插入更罕见的中文字符,此时它将无法工作。(例如,请参见错误 #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? 字符的编码;这意味着 ? 是实际存储在该列中的字符。这通常是由于从客户端字符集到目标字符集的转换问题所致。

  • 确保往返操作是可能的。当您选择 literal(或 _introducer hexadecimal-value)时,您是否获得了 literal 作为结果?

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

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

    如果结果不是 ,则往返操作失败。

    对于有关此类故障的错误报告,我们可能会要求您跟进 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 变体)优于 Latin,但它通常不是您的操作系统实用程序最支持的字符集。许多 Windows 用户发现 Microsoft 字符集(例如日语 Windows 的 cp932)很合适。

    如果您无法控制服务器设置,并且您不知道底层计算机使用什么设置,请尝试更改为您所在国家/地区的常用字符集(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
BROKEN BAR 00A6 3F 3F 8FA2C3 3F
FULLWIDTH BROKEN BAR FFE4 3F FA55 3F 8FA2
YEN SIGN 00A5 3F 3F 20 3F
FULLWIDTH YEN SIGN FFE5 818F 818F A1EF 3F
TILDE 007E 7E 7E 7E 7E
OVERLINE 203E 3F 3F 20 3F
HORIZONTAL BAR 2015 815C 815C A1BD A1BD
EM DASH 2014 3F 3F 3F 3F
REVERSE SOLIDUS 005C 815F 5C 5C 5C
FULLWIDTH REVERSE SOLIDUS FF3C 3F 815F 3F A1C0
WAVE DASH 301C 8160 3F A1C1 3F
FULLWIDTH TILDE FF5E 3F 8160 3F A1C1
DOUBLE VERTICAL LINE 2016 8161 3F A1C2 3F
PARALLEL TO 2225 3F 8161 3F A1C2
MINUS SIGN 2212 817C 3F A1DD 3F
FULLWIDTH HYPHEN-MINUS FF0D 3F 817C 3F A1DD
CENT SIGN 00A2 8191 3F A1F1 3F
FULLWIDTH CENT SIGN FFE0 3F 8191 3F A1F1
POUND SIGN 00A3 8192 3F A1F2 3F
FULLWIDTH POUND SIGN FFE1 3F 8192 3F A1F2
NOT SIGN 00AC 81CA 3F A2CC 3F
FULLWIDTH NOT SIGN FFE2 3F 81CA 3F A2CC

现在考虑表中的以下部分。

ucs2 sjis cp932
NOT SIGN 00AC 81CA 3F
FULLWIDTH NOT SIGN FFE2 3F 81CA

这意味着 MySQL 将 NOT SIGN(Unicode U+00AC)转换为 sjis 代码点 0x81CAcp932 代码点 3F。(3F 是问号 (?。当无法执行转换时,始终使用此方法。)

A.11.5.

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

我们的答案是:“?。这有缺点,许多人更喜欢“松散 转换,因此 sjis 中的 81CA (NOT SIGN)cp932 中变为 81CA (FULLWIDTH NOT SIGN)

A.11.6.

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

出现问题是因为某些版本的日语字符集(sjiseuc)都将 5C 视为 反斜杠 (\,也称为反斜杠),而另一些则将其视为日元符号 (¥)。

MySQL 仅遵循 JIS(日本工业标准)标准描述的一个版本。在 MySQL 中,5C 始终是反斜杠 (\).

A.11.7.

在 MySQL 中使用韩语字符集时,我应该注意哪些问题?

理论上,虽然 euckr (扩展 Unix 代码韩国) 字符集有多个版本,但只发现了一个问题。我们使用 EUC-KR 的“ASCII 变体,其中代码点 0x5c 是 REVERSE SOLIDUS,即 \,而不是 EUC-KR 的“KS-Roman 变体,其中代码点 0x5cWON SIGN ()。这意味着您无法将 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)

INSERT 会产生警告。使用以下语句查看警告是什么

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 消息会作为错误而不是警告出现,并且 INSERT 失败。

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 应用程序中经常遇到的另一个问题与浏览器所做的假设有关。有时添加或更改 <meta> 标记足以解决问题:例如,为了确保用户代理将页面内容解释为 UTF-8,请在 HTML 页面的 <head> 部分中包含 <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 来关闭。如果您使用 mysqld 命令并添加 --skip-character-set-client-handshake 来启动服务器,那么当客户端连接时,它会将要使用的字符集名称发送给服务器。但是,服务器会忽略客户端的这个请求

举个例子,假设您最喜欢的服务器字符集是 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.

为什么一些带有 CJK 字符的 LIKEFULLTEXT 搜索会失败?

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

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

如果我们不知道字符串中第一个字符在哪里结束,我们就不知道第二个字符在哪里开始,在这种情况下,即使是非常简单的搜索(如 LIKE '_A%')也会失败。解决方案是使用非二进制字符串列类型,该类型定义为具有正确的 CJK 字符集。例如:mycol TEXT CHARACTER SET sjis。或者,在比较之前转换为 CJK 字符集。

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

对于 FULLTEXT 搜索,我们必须知道单词在哪里开始和结束。对于西方语言来说,这很少是一个问题,因为大多数(如果不是全部)西方语言都使用一个易于识别的词边界:空格字符。但是,对于亚洲文字来说,情况通常并非如此。我们可以使用任意的方法,例如假设所有汉字都代表单词,或者(对于日语)根据从片假名到平假名的变化(由于语法结尾)。但是,唯一的可靠解决方案需要一个全面的词典,这意味着我们必须为支持的每种亚洲语言在服务器中包含一个词典。这显然不可行。

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)

从 MySQL 8.0 开始,可以使用 utf8mb4 字符集和 utf8mb4_ja_0900_as_cs 排序规则来解决在旧版 MySQL 版本中出现的 CJK 排序问题。

A.11.14.

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

从 MySQL 8.0 开始,可以使用 utf8mb4 字符集和 utf8mb4_ja_0900_as_cs 排序规则来解决在旧版 MySQL 版本中出现的 CJK 排序问题。

A.11.15.

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

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

要存储补充字符,您必须使用允许它们使用的字符集

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

    utf8 字符集仅允许占用最多三个字节的 UTF-8 字符。这导致了 Bug #12600 中的报告,我们将其拒绝为 不是错误。对于 utf8,当 MySQL 遇到它无法识别的字节时,它必须截断输入字符串。否则,就无法知道错误的多字节字符有多长。

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

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

A.11.16.

“CJK” 应该改为 “CJKV” 吗?

不。术语 “CJKV” (中文 日文 韩文 越南文) 指的是包含汉字 (最初为中文) 的越南字符集。MySQL 支持使用西方字符的现代越南语脚本,但不支持使用汉字的旧越南语脚本。

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

A.11.17.

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

是的。

A.11.18.

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

可以从 https://dev.mysqlserver.cn/doc/ 下载 MySQL 5.6 手册的日语翻译。

A.11.19.

在哪里可以获得有关 MySQL 中 CJK 和相关问题的帮助?

可以使用以下资源