在MySQL中使用不同于schema默认的列charset是否有任何缺点?

时间:2016-10-06 03:08:47

标签: mysql unicode utf-8 character-encoding

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

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

我不确定更改列或仅使用ascii char set是否是一个好主意?使用不同的字符集到架构或表的默认值是否有任何性能或设计含义?对整理有任何影响吗? 目前我使用默认字符集' utf8'和默认排序' utf8_general_ci'。

1 个答案:

答案 0 :(得分:1)

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

表格的charset只是默认;它不起任何其他作用。

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

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

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

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

当你拥有数百万行时,

UUIDs(以及MD5等)有一个不同的问题 - 它们非常随机,从而导致在表格中大量跳跃。如果表太大而无法缓存在RAM中,性能可能会变得非常糟糕。

当你的uuid上有JOINing个表格时,两个表格中uuid的声明必须具有相同的字符集和整理。