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


12.10.7.1 cp932 字符集

为什么需要 cp932

在 MySQL 中,sjis 字符集对应于 IANA 定义的 Shift_JIS 字符集,它支持 JIS X0201 和 JIS X0208 字符。(参见 http://www.iana.org/assignments/character-sets。)

但是,“SHIFT JIS”作为描述性术语的含义已经变得非常模糊,它通常包括各种供应商定义的 Shift_JIS 扩展。

例如,日语 Windows 环境中使用的“SHIFT JIS”是 Shift_JIS 的 Microsoft 扩展,其确切名称为 Microsoft Windows Codepage : 932cp932。除了 Shift_JIS 支持的字符外,cp932 还支持 NEC 特殊字符、NEC 选定 - IBM 扩展字符和 IBM 选定字符。

许多日本用户在使用这些扩展字符时遇到了问题。这些问题源于以下因素

  • MySQL 自动转换字符集。

  • 字符集使用 Unicode (ucs2) 进行转换。

  • sjis 字符集不支持转换这些扩展字符。

  • 从所谓的“SHIFT JIS”到 Unicode 有几种转换规则,并且某些字符根据转换规则的不同,其 Unicode 转换结果也不同。MySQL 仅支持其中一种规则(稍后描述)。

MySQL cp932 字符集旨在解决这些问题。

由于 MySQL 支持字符集转换,因此将 IANA Shift_JIScp932 分成两个不同的字符集非常重要,因为它们提供不同的转换规则。

cp932sjis 有什么区别?

cp932 字符集与 sjis 的区别在于以下方面

  • cp932 支持 NEC 特殊字符、NEC 选定 - IBM 扩展字符和 IBM 选定字符。

  • 某些 cp932 字符有两个不同的代码点,它们都转换为相同的 Unicode 代码点。当从 Unicode 转换回 cp932 时,必须选择其中一个代码点。对于这种“往返转换”,将使用 Microsoft 推荐的规则。(参见 http://support.microsoft.com/kb/170559/EN-US/。)

    转换规则的工作原理如下

    • 如果字符同时存在于 JIS X 0208 和 NEC 特殊字符中,则使用 JIS X 0208 的代码点。

    • 如果字符同时存在于 NEC 特殊字符和 IBM 选定字符中,则使用 NEC 特殊字符的代码点。

    • 如果字符同时存在于 IBM 选定字符和 NEC 选定 - IBM 扩展字符中,则使用 IBM 扩展字符的代码点。

    https://msdn.microsoft.com/en-us/goglobal/cc305152.aspx 中显示的表格提供了有关 cp932 字符的 Unicode 值的信息。对于在 cp932 表格条目中包含有四位数字的字符,该数字代表相应的 Unicode (ucs2) 编码。对于包含有带下划线的两位数的表格条目,则表示有一系列以这两位数开头的 cp932 字符值。单击这样的表格条目将带您进入一个页面,该页面将显示以这两位数开头的每个 cp932 字符的 Unicode 值。

    以下链接特别有用。它们对应于以下字符集的编码

    • NEC 特殊字符(前导字节 0x87

      https://msdn.microsoft.com/en-us/goglobal/gg674964
    • NEC 选定 - IBM 扩展字符(前导字节 0xED0xEE

      https://msdn.microsoft.com/en-us/goglobal/gg671837
      https://msdn.microsoft.com/en-us/goglobal/gg671838
    • IBM 选定字符(前导字节 0xFA0xFB0xFC

      https://msdn.microsoft.com/en-us/goglobal/gg671839
      https://msdn.microsoft.com/en-us/goglobal/gg671840
      https://msdn.microsoft.com/en-us/goglobal/gg671841
  • cp932 支持与 eucjpms 结合的用户定义字符转换,并解决了 sjis/ujis 转换问题。有关详细信息,请参见 http://www.sljfaq.org/afaq/encodings.html

对于某些字符,sjiscp932ucs2 转换不同。以下表格说明了这些差异。

转换为 ucs2

sjis/cp932 sjis -> ucs2 转换 cp932 -> ucs2 转换
5C 005C 005C
7E 007E 007E
815C 2015 2015
815F 005C FF3C
8160 301C FF5E
8161 2016 2225
817C 2212 FF0D
8191 00A2 FFE0
8192 00A3 FFE1
81CA 00AC FFE2

ucs2 转换

ucs2 ucs2 -> sjis 转换 ucs2 -> cp932 转换
005C 815F 5C
007E 7E 7E
00A2 8191 3F
00A3 8192 3F
00AC 81CA 3F
2015 815C 815C
2016 8161 3F
2212 817C 3F
2225 3F 8161
301C 8160 3F
FF0D 3F 817C
FF3C 3F 815F
FF5E 3F 8160
FFE0 3F 8191
FFE1 3F 8192
FFE2 3F 81CA