在mysql中使用不同于schema default的列字符集有什么缺点吗?

puruo6ea  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(349)

在我的应用程序中,我将id存储在一个char(16)形式的表中,计算为十六进制(uuid_short()),以使它可以与memcached plugin一起使用,memcached plugin要求“key”是char或varchar。示例值:57f328cf000003
如果我把它留给默认字符集utf8,根据文档,它将使用3x16字节,因为utf8最多可以有3个字节。但是对于我的用例中可能的值(1-9位和a-f),1字节ascii字符集就足够了。
我不确定仅仅改变列还是仅仅改变表来使用ascii字符集是一个好主意?对schema或表的默认值使用不同的字符集是否会影响性能或设计?对校勘有什么影响吗?目前我使用默认字符集“utf8”和默认排序规则“utf8\u general\u ci”。

5us2dqdw

5us2dqdw1#

当然有可能有不同的 CHARACTER SETs (和/或 COLLATIONs )在同一表格的不同列中。
表的字符集只是一个默认值;它不起其他作用。
对于十六进制、ip地址、邮政编码等,强烈建议使用 CHARACTER SET ascii ( latin1 几乎一样好)。 CHAR(16) 意味着有16个字符,它是固定长度的,所以长度是16*可能的最长字符。对于utf8是48字节。浪费了32个字节。 VARCHAR(16) 长度为1字节,加上16个字符所需的字节,所以16个十六进制字符为17个。
使用ascii是一种性能优势,因为它使表更小。去做吧。 UUIDs (和md5s等)有一个不同的问题,当你有数百万行的时候——它们是非常随机的,从而导致在表中跳跃很多。如果表太大而不能缓存在ram中,性能可能会变得很糟糕。
什么时候 JOINing 在两个表中的uuid声明必须具有相同的字符集和排序规则。

相关问题