为什么cp932
需要?
在MySQL中,sjis
字符集对应Shift_JIS
IANA定义的字符集,支持JIS X0201和JIS X0208字符。(参见
http://www.iana.org/assignments/character-sets。)
然而,“ SHIFT JIS ”作为一个描述性术语的含义已经变得非常模糊,它通常包括Shift_JIS
各种供应商定义的扩展。
例如,日语 Windows 环境中使用的
“ SHIFT JIS ”Shift_JIS
是 Microsoft 的扩展名,其确切名称是
Microsoft Windows Codepage : 932
或
cp932
。除了 支持的字符外Shift_JIS
,
还cp932
支持扩展字符,如 NEC 特殊字符、NEC selected—IBM 扩展字符、IBM selected 字符。
许多日本用户在使用这些扩展字符时遇到问题。这些问题源于以下因素:
MySQL 自动转换字符集。
字符集使用 Unicode (
ucs2
) 进行转换。sjis
字符集不支持这些扩展字符的转换 。从所谓的 “ SHIFT JIS ”到 Unicode 的转换规则有几种,根据转换规则,某些字符转换为 Unicode 的方式也不同。MySQL 只支持这些规则之一(稍后描述)。
MySQLcp932
字符集就是为了解决这些问题而设计的。
因为 MySQL 支持字符集转换,所以将 IANAShift_JIS
和
cp932
分成两个不同的字符集很重要,因为它们提供不同的转换规则。
与有何cp932
不同?sjis
cp932
字符集
在
以下sjis
方面有所不同:
cp932
支持 NEC 特殊字符、NEC selected—IBM 扩展字符和 IBM selected 字符。一些
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 中显示的表格 提供了有关字符的 Unicode 值的信息
cp932
。对于cp932
其下出现四位数字的字符的表条目,该数字表示相应的 Unicode (ucs2
) 编码。对于带有带下划线的两位数值的表条目,存在cp932
以这两位数开头的字符值范围。单击此类表条目会将您带到一个页面,该页面显示cp932
以这些数字开头的每个字符的 Unicode 值。以下链接特别有趣。它们对应于以下字符集的编码:
NEC 特殊字符(前导字节
0x87
):https://msdn.microsoft.com/en-us/goglobal/gg674964
NEC selected—IBM 扩展字符(前导字节
0xED
和0xEE
):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
/ujis
转换的问题。详情请参考 http://www.sljfaq.org/afaq/encodings.html。
对于某些字符,与 之间的相互转换
ucs2
是不同
sjis
的cp932
。下表说明了这些差异。
转换为ucs2
:
sjis /cp932 值 |
sjis ->ucs2 转换 |
cp932 ->ucs2 转换 |
---|---|---|
5C | 005C | 005C |
7E | 007E | 007E |
815C | 2015年 | 2015年 |
815F | 005C | 最终幻想3 |
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 |
最终幻想3 | 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 节,“服务器命令选项”。