#### 10.10.7.1 cp932 字符集

**为什么是`cp932`需要吗？**

在 MySQL 中，`sjis`字符集对应`Shift_JIS`IANA 定义的字符集，支持 JIS X0201 和 JIS X0208 字符。（看<http://www.iana.org/assignments/character-sets>.)

然而，“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_JIS`和`cp932`分成两个不同的字符集，因为它们提供了不同的转换规则。

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

这`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>提供有关 Unicode 值的信息`cp932`人物。为了`cp932`带有字符的表条目，其下出现一个四位数的数字，该数字代表相应的 Unicode (`ucs2`) 编码。对于带有下划线的两位数值的表格条目，有一个范围`cp932`以这两位数字开头的字符值。单击此类表条目会将您带到一个页面，该页面显示每个表的 Unicode 值`cp932`以这些数字开头的字符。

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

    -   NEC 特殊字符（前导字节`0x87`):

        ```
        https://msdn.microsoft.com/en-us/goglobal/gg674964
        ```

    -   选择 NEC — 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`/`乌吉斯`转换。详情请参阅<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 | 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`](server-options.html#option_mysqld_character-set-client-handshake)（要么[`--skip-character-set-client-handshake`](server-options.html#option_mysqld_character-set-client-handshake)) 有重要作用。看[第 5.1.7 节，“服务器命令选项”](server-options.html).
