Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

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" 是 Microsoft 对 Shift_JIS 的扩展,其确切名称是 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 时,必须选择其中一个代码点。对于这种“圆trip 转换,” 微软推荐的规则将被使用。(见 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 特殊字符(lead byte 0x87):

      https://msdn.microsoft.com/en-us/goglobal/gg674964
    • NEC 选定—IBM 扩展字符(lead byte 0xED0xEE):

      https://msdn.microsoft.com/en-us/goglobal/gg671837
      https://msdn.microsoft.com/en-us/goglobal/gg671838
    • IBM 选定字符(lead byte 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

对于一些字符,从 ucs2cp932 的转换不同于 sjiscp932。以下表格说明了这些差异。

转换到 ucs2

sjis/cp932 Value sjis -> ucs2 Conversion cp932 -> ucs2 Conversion
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 £ ǵ
81CA ¬ ǵ

ucs2 转换:

ucs2 value ucs2 -> sjis Conversion ucs2 -> cp932 Conversion
005C 低 surrogate \
007E ~ ~
00A2 高 surrogate ?
00A3 补充字符 ?
00AC ? ?
2015 低 surrogate 低 surrogate
2016 ? ?
2212 ? ?
2225 ? ?
301C ? ?
FF0D ? ?
FF3C ? 低 surrogate
FF5E ? ?
FFE0 ? 高 surrogate
FFE1 ? 补充字符
FFE2 ? ?