【问题标题】:Are there any disadvantages to using column charset different to schema default in MySQL?在 MySQL 中使用不同于模式默认值的列字符集有什么缺点吗?
【发布时间】:2017-02-14 15:53:13
【问题描述】:

在我的应用程序中,我将 id 作为 char(16) 存储在表中,计算为 hex(uuid_short()) 以使其可与需要“key”为 char 或 varchar 的 memcached 插件一起使用。 示例值:57F328CF000003

如果我将其保留为默认字符集 utf8,根据docs,它将使用 3x16 字节,因为 utf8 最多可以有 3 个字节。 但是,对于我的用例中的可能值(1-9 位和 A-F),1 字节的 ascii 字符集就足够了。

我不确定仅更改列还是仅更改表以使用 ascii 字符集是否是个好主意?对默认模式或表使用不同的字符集是否有任何性能或设计影响?对排序有任何影响吗? 目前我使用默认字符集“utf8”和默认排序规则“utf8_general_ci”。

【问题讨论】:

    标签: mysql unicode utf-8 character-encoding


    【解决方案1】:

    在同一个表的不同列中当然可以有不同的CHARACTER SETs(和/或COLLATIONs)。

    表格的字符集只是一个默认值;它没有其他作用。

    对于十六进制、IP 地址、邮政编码等,强烈建议使用CHARACTER SET asciilatin1 几乎一样好)。

    CHAR(16)表示有16个字符,而且是固定长度,所以长度是16*可能的最长字符。那是 utf8 的 48 个字节。浪费了 32 个字节。

    VARCHAR(16) 的长度为 1 字节,再加上最多 16 个字符所需的字节,因此 16 个十六进制字符为 17。

    使用 ascii 是一种性能好处,因为它使表格更小。去做吧。

    UUIDs(和 MD5 等)在拥有数百万行时会遇到不同的问题——它们非常随机,从而导致在表中跳来跳去。如果表太大而无法缓存在 RAM 中,性能可能会变得糟糕

    JOINing 表在您的 uuid 上时,两个表中 uuid 的声明必须具有相同的字符集和排序规则。

    【讨论】:

    • 谢谢瑞克!您的回答极大地影响了我的应用程序的架构。 +1
    猜你喜欢
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 2011-07-02
    • 2013-07-29
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    相关资源
    最近更新 更多