文档主页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
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 JISShift_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