Documentation Home
MySQL 8.4 Reference Manual
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


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 Windows Codepage : 932cp932。此外,cp932 还支持 NEC 特殊字符、NEC 选定的—IBM 扩展字符和 IBM 选定的字符。

许多日本用户曾经遇到使用这些扩展字符的问题。这些建议来自以下因素:

  • MySQL 自动将字符集转换。

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

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

  • 从所谓的““SHIFT JIS””到 Unicode,有多种转换规则,某些字符根据转换规则不同地被转换。MySQL 只支持其中的一种(后面描述)。

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

因为 MySQL 支持字符集转换,所以需要将 IANA Shift_JIScp932 分别作为两个不同的字符集,因为它们提供不同的转换规则。

cp932sjis 之间的差异?

cp932 字符集与 sjis 在以下方面不同:

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

  • 某些 cp932 字符有两个不同的代码点,都是转换到同一个 Unicode 代码点。从 Unicode 回转到 cp932 时,必须选择其中一个代码点。对于这个““回环转换,””,微软推荐的规则被使用。(见http://support.microsoft.com/kb/170559/EN-US/。)

    转换规则如下:

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

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

    • 如果字符同时在IBM选择字符和NEC选择字符中,使用IBM扩展字符的代码点。

    https://msdn.microsoft.com/en-us/goglobal/cc305152.aspx 表中提供了 cp932 字符的 Unicode 值信息。对于表项中出现四位数字的字符,数字表示对应的 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

对于一些字符,转换到和从ucs2不同于sjiscp932。以下表格illustrate这些差异。

转换到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 00A3 FFE1
81CA 00AC FFE2

转换从ucs2:

ucs2 value ucs2 -> sjis Conversion ucs2 -> cp932 Conversion
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