【问题标题】:Chinese names and Unicode Basic Multilingual Plane (BMP)中文名称和 Unicode 基本多语言平面 (BMP)
【发布时间】:2018-02-03 09:36:02
【问题描述】:

我正在使用MySQL构建一个应用程序,其中中文名称需要存储在数据库中。我正在尝试决定是否使用基本的utf8 编码(仅适用于基本多语言平面,并且在 UTF-8 编码中每个字符最多存储 3 个字节),或者我是否需要使用utf8mb4 编码,它允许对来自更高平面的字符进行编码/存储。

Unicode 基本多语言平面 (BMP) 是否足以存储所有中文专有名称?

【问题讨论】:

    标签: mysql unicode encoding utf-8


    【解决方案1】:

    MySQL 的 CHARACTER SET utf8 仅处理 3 字节的 UTF-8 代码 (BMP)。相反,请使用CHARACTER SET utf8mb4,它处理所有 4 字节代码。是的,包括当前为中文、表情符号等定义的所有 Unicode。

    如果可行,请使用 5.7 版。

    【讨论】:

    • 我这个问题的初衷是想了解中文名字是否需要支持Unicode BMP之外的字符,只有最大三字节utf8编码支持。事实上,这个问题本身有点误解,对于新建应用程序,从utf8mb4 编码开始似乎没有任何缺点,因为字符占用了相同数量的空间。
    • 中文确实有一些非BMP字符。
    【解决方案2】:

    TL;DR没关系,坚持utf8mb4 编码,尤其是对于新应用程序。

    长格式答案:这两种编码之间的主要区别在于 MySQL 长期支持的 utf8 支持最长三个字节的 UTF8 编码字符。从 5.5.3 开始,正如 @rick-james 所指出的,一种新的编码 utf8mb4 放宽了这个限制,并且没有任何缺点。

    根据MySQL documentation,较新的utf8mb4 编码解除了这种任意三个字符的限制,并且几乎没有缺点:

    • 对于 BMP 字符,utf8utf8mb4 具有相同的存储特性:相同的代码值、相同的编码、相同的长度。
    • 对于补充字符,utf8 根本无法存储该字符,而utf8mb4 需要四个字节来存储它。因为utf8 根本无法存储字符,所以您在utf8 列中没有补充字符,并且在从旧版本的MySQL 升级utf8 数据时不必担心转换字符或丢失数据。

    因此,我最初的问题被误解了:对中文名称的每个字符进行编码的最大字节数应该不重要,只要您使用的编码实际上支持编码所有 Unicode 代码点。

    【讨论】:

    • 一个缺点是索引有 767 字节的限制(直到 5.7)。有多种解决方法。
    猜你喜欢
    • 2018-01-22
    • 2013-10-23
    • 1970-01-01
    • 2012-04-03
    • 2011-12-13
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    相关资源
    最近更新 更多