mysql - 在 MySQL 中使用与模式默认值不同的列字符集有什么缺点吗?

标签 mysql unicode utf-8 character-encoding

在我的应用程序中,我将 ids 作为 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”。

最佳答案

当然有可能有不同的 CHARACTER SETs (和/或 COLLATIONs )位于同一表的不同列中。

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

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

CHAR(16)表示有 16 个字符,并且是固定长度,因此长度为 16 * 最长可能的字符。对于 utf8 来说是 48 个字节。浪费了 32 个字节。

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

使用 ascii 可以提高性能优势,因为可以使表变小。做吧。

UUIDs当您有数百万行时(以及 MD5 等)会遇到不同的问题 - 它们非常随机,从而导致表中出现大量跳转。如果表太大而无法缓存在 RAM 中,性能可能会变得糟糕

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

关于mysql - 在 MySQL 中使用与模式默认值不同的列字符集有什么缺点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39886899/

相关文章:

php - laravel 插入查询值空

python - 如何处理列中的 unicode 值 dict

excel - 使用 UTF-8 编码的 VBA Excel 宏写入文件

mysql - 如何在mysql数据库中添加复选框值?

php - 使用 PHP 将 JSON 数据插入 MySQL

当由第三个分组时,MySQL 根据另一个字段的最小值更新字段

unicode - 以编程方式确定汉字的笔画数?

unicode - 将普通空格/空格转换为不间断空格?

c++ - 未在 html head 中指定时,如何使用 cpp-netlib 读取 UTF-8 编码

linux - scp 文件到 linux 自动将文件名转换为 utf8