为什么cp932
需要吗?
在MySQL中,sjis
字符集对应于Shift_JIS
由IANA定义的字符集,支持JIS X0201和JIS X0208字符。(见http://www.iana.org/assignments/character-sets.)
然而,意义”SHIFT JIS”作为一个描述性的术语已经变得非常模糊,它经常包括to的扩展Shift_JIS
由不同的供应商定义。
例如,”SHIFT JIS”在日文Windows环境中使用的是微软的扩展Shift_JIS
确切的名字是微软Windows代码页:932
或cp932
.除了字符支持Shift_JIS
,cp932
支持扩展字符,如NEC特殊字符、NEC选择- IBM扩展字符和IBM选择字符。
许多日本用户在使用这些扩展字符时会遇到问题。产生这些问题的原因有以下几个方面:
MySQL自动转换字符集。
字符集使用Unicode (
ucs2
).的
sjis
字符集不支持这些扩展字符的转换。从所谓的有几个转换规则”SHIFT JIS”根据转换规则的不同,有些字符会以不同的方式转换为Unicode。MySQL只支持其中一种规则(稍后将介绍)。
MySQLcp932
字符集就是为了解决这些问题而设计的。
因为MySQL支持字符集转换,所以分离IANA非常重要Shift_JIS
而且cp932
转换为两个不同的字符集,因为它们提供不同的转换规则。
如何cp932
不同于sjis
?
的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扩展字符,则使用IBM扩展字符的代码点。
表格载于https://msdn.microsoft.com/en-us/goglobal/cc305152.aspx的Unicode值的信息
cp932
字符。为cp932
表项,其中的字符下面有一个四位数的数字,该数字表示相应的Unicode (ucs2
)编码。对于出现带下划线的两位数值的表项,范围为cp932
以这两个数字开头的字符值。单击这样的表项会转到一个页面,该页面显示每个cp932
以这些数字开头的字符。下面的链接特别有趣。它们对应于以下字符集的编码:
NEC特殊字符(前字节)
0 x87
):https://msdn.microsoft.com/en-us/goglobal/gg674964
NEC选择的ibm扩展字符(前导字节
0中
而且0 xee
):https://msdn.microsoft.com/en-us/goglobal/gg671837 https://msdn.microsoft.com/en-us/goglobal/gg671838
IBM选择的字符(前导字节
0 xfa
,0 xfb
,0 xfc
):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.
对于某些字符,转换到和从ucs2
是不同的sjis
而且cp932
.下表说明了这些差异。
转换为ucs2
:
sjis /cp932 价值 |
sjis ->ucs2 转换 |
cp932 ->ucs2 转换 |
---|---|---|
5度 | 005 c | 005 c |
7 e | 007 e | 007 e |
815 c | 2015 | 2015 |
华氏815度 | 005 c | FF3C |
8160 | 301 c | FF5E |
8161 | 2016 | 2225 |
817 c | 2212 | FF0D |
8191 | 00 a2 | FFE0 |
8192 | 00 a3 | FFE1 |
81 ca | 00交流 | FFE2 |
转换从ucs2
:
ucs2 价值 |
ucs2 ->sjis 转换 |
ucs2 ->cp932 转换 |
---|---|---|
005 c | 华氏815度 | 5度 |
007 e | 7 e | 7 e |
00 a2 | 8191 | 3 f |
00 a3 | 8192 | 3 f |
00交流 | 81 ca | 3 f |
2015 | 815 c | 815 c |
2016 | 8161 | 3 f |
2212 | 817 c | 3 f |
2225 | 3 f | 8161 |
301 c | 8160 | 3 f |
FF0D | 3 f | 817 c |
FF3C | 3 f | 华氏815度 |
FF5E | 3 f | 8160 |
FFE0 | 3 f | 8191 |
FFE1 | 3 f | 8192 |
FFE2 | 3 f | 81 ca |
使用任何日文字符集的用户都应该注意使用——character-set-client-handshake
(或——skip-character-set-client-handshake
)有很重要的作用。看到第5.1.7节,“服务器命令选项”.