10.10.7.1 cp932 字符集

为什么需要cp932

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

但是,“ SHIFT JIS”作为描述性术语的含义已经变得很模糊,并且通常包括由各种供应商定义的Shift_JISextensions。

例如,在日语 Windows 环境中使用的“ SHIFT JIS”是 MicrosoftextensionsShift_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时,必须选择一个代码点。对于此“往返转换”,使用 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处显示的 table 提供有关cp932个字符的 Unicode 值的信息。对于带有字符的cp932table 条目,其下出现一个四位数的数字,该数字 table 示相应的 Unicode(ucs2)编码。对于带有带下划线的两位数字值的 table 条目,存在以该两位数字开头的cp932字符值范围。单击此类 table 条目将带您到一个页面,该页面显示以这些数字开头的每个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

对于某些字符,sjiscp932ucs2之间的转换是不同的。下 table 说明了这些差异。

转换为ucs2

sjis/cp932sjis-> ucs2转换cp932-> ucs2转换
5C005C005C
7E007E007E
815C20152015
815F005CFF3C
8160301CFF5E
816120162225
817C2212FF0D
819100A2FFE0
819200A3FFE1
81CA00ACFFE2

来自ucs2的转化:

ucs2ucs2-> sjis转换ucs2-> cp932转换
005C815F5C
007E7E7E
00A281913F
00A381923F
00AC81CA3F
2015815C815C
201681613F
2212817C3F
22253F8161
301C81603F
FF0D3F817C
FF3C3F815F
FF5E3F8160
FFE03F8191
FFE13F8192
FFE23F81CA

任何日语字符集的用户都应注意,使用--character-set-client-handshake(或--skip-character-set-client-handshake)具有重要的作用。参见第 5.1.6 节“服务器命令选项”