在我的应用程序中,我将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”。
1条答案
按热度按时间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声明必须具有相同的字符集和排序规则。