# 10.10.7.1 cp932 字符集

为什么是cp932需要吗?

在 MySQL 中,sjis字符集对应Shift_JISIANA 定义的字符集,支持 JIS X0201 和 JIS X0208 字符。(看http://www.iana.org/assignments/character-sets (opens new window).)

然而,“SHIFT JIS”作为描述性术语的含义已经变得非常模糊,它通常包括对Shift_JIS由不同的供应商定义。

例如,日文 Windows 环境中使用的“SHIFT JIS”是 Microsoft 对Shift_JIS它的确切名称是Microsoft Windows 代码页:932要么cp932.除了支持的字符Shift_JIS,cp932支持扩展字符,例如 NEC 特殊字符、NEC 选择—IBM 扩展字符和 IBM 选择字符。

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

  • MySQL 自动转换字符集。

  • 字符集使用 Unicode (ucs2)。

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

  • 从所谓的“SHIFT JIS”到 Unicode 有几种转换规则,根据转换规则的不同,某些字符转换为 Unicode 的方式也不同。MySQL 仅支持这些规则之一(稍后描述)。

    MySQL的cp932字符集就是为了解决这些问题而设计的。

    因为 MySQL 支持字符集转换,所以分离 IANA 很重要Shift_JIScp932分成两个不同的字符集,因为它们提供了不同的转换规则。

如何cp932与......不同sjis?

cp932字符集不同于sjis通过以下方式:

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

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

    转换规则是这样工作的:

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

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

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

      该表显示在https://msdn.microsoft.com/en-us/goglobal/cc305152.aspx (opens new window)提供有关 Unicode 值的信息cp932人物。为了cp932带有字符的表条目,其下出现一个四位数的数字,该数字代表相应的 Unicode (ucs2) 编码。对于带有下划线的两位数值的表格条目,有一个范围cp932以这两位数字开头的字符值。单击此类表条目会将您带到一个页面,该页面显示每个表的 Unicode 值cp932以这些数字开头的字符。

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

    • 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 选定字符(前导字节0xFA,0xFB,0xFC):

      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/乌吉斯转换。详情请参阅http://www.sljfaq.org/afaq/encodings.html (opens new window).

    对于某些字符,转换为和从ucs2是不同的sjiscp932.下表说明了这些差异。

    转换为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 815 楼 生菜
007 H H
00一 8191 打扰一下
00 8192 打扰一下
00S 81 打扰一下
2015 815 815
2016 年 8161 打扰一下
2212 817 打扰一下
2225 打扰一下 8161
301s 8160 打扰一下
FF0D 3F 817C
FF3C 3F 815F
FF5E 3F 8160
FFE0 3F 8191
FFE1 3F 8192
FFE2 3F 81CA

任何日文字符集的用户都应该知道,使用--character-set-client-handshake(要么--skip-character-set-client-handshake) 有重要作用。看第 5.1.7 节,“服务器命令选项”.