【发布时间】:2011-12-26 16:51:21
【问题描述】:
我开始对 MySQL 的内存使用非常感兴趣。所以我在这里看这个:
http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html
我对节省内存的前景感到非常兴奋(例如)只需要一个有符号的 smallint,而我在许多地方都使用了一个无符号的 int。然后我读到了 varchars...
“VARCHAR(M) - 如果列值需要 0 – 255 个字节,则长度 + 1 个字节”
什么?! 现在在我看来,存储单个 varchar 会占用如此多的内存,我什至可能对我的 int 与 smallint 不感到兴奋,因为它被大大掩盖了通过 varchar 字段。所以我来这里问这是不是真的,因为它根本不可能? varchars真的那么可怕吗?还是我真的不应该对我的 smallint 发现感到兴奋?
编辑:对不起!我应该更清楚。所以,假设我存储了一个包含 7 个字符的 varchar,即 8 个字节。那么,这意味着它使用与存储在 BIGINT 列中的数字相同的数字吗?这就是我所关心的。
【问题讨论】:
-
您可能误解了文档。如果列值需要 0-255 个字节,其中 L - 是实际长度,则 Varchar(M) 需要 L+1。因此,如果列声明为
varchar(255),latin1字符集并包含'aaa',则存储长度为3+1 = 4。 -
varchar 存储您输入的字符数 + 一个字节来存储长度,如果您有一个 varchar(64) 字段并将字符串“世界和平”放入其中,该字段将占用 12 个字节(11 个用于字符串,1 个用于长度)。如果长度大于 255,则需要两个字节来存储它。另一方面,CHAR 列将始终占用分配给它们的大小(CHAR(16) 字段将始终占用 16 个字节,而 VARCHAR(16) 将仅占用 17 个字节,如果您放置一个 6 个字节长的字符串, 5个字节的字符串将占用6)。
标签: mysql database-design memory-management varchar mysql-management