我看到评论“如果 varchar(20) 列中有 5000 万个 10 到 15 个字符之间的值,而 varchar(50) 列中有同样的 5000 万个值,它们将占用完全相同的空间。这就是重点varchar,而不是 char”。有人可以告诉我原因吗?看人员“姓名”字段的合理长度限制是多少? https://stackoverflow.com/questions/30485/what-is-a-reasonable-length-limit-on-person-name-fields#comment-3373890
MySQL 提供多种存储引擎选择。数据的物理存储取决于存储引擎。
VARCHAR 的 MyISAM 存储
在 MyISAM 中,VARCHAR
s 通常只占用字符串的实际长度加上一个或两个字节的长度。这是由于 MyISAM 对表锁定(而不是行锁定功能)的设计限制而变得实用的。性能后果包括更紧凑的缓存配置文件,但也包括更复杂(更慢)的记录偏移计算。
(事实上,MyISAM 给你一定程度的选择 http://dev.mysql.com/doc/refman/5.1/en/static-format.html固定物理行大小和可变物理行大小表格式之间的关系取决于整个表中出现的列类型。发生情况VARCHAR
仅更改默认方法,但存在TEXT
blob forces VARCHAR
同一个表中的 s 也使用可变长度方法。)
物理存储方法对于索引尤为重要,这与表不同。 MyISAM 使用空间压缩both CHAR
and VARCHAR
列,这意味着在这两种情况下,较短的数据在索引中占用的空间较小。
VARCHAR 的 InnoDB 存储
InnoDB 与当前大多数其他关系数据库一样,使用更复杂的机制。VARCHAR
最大宽度小于 768 字节的列将内联存储,并保留与最大宽度匹配的空间。更精确地here http://dev.mysql.com/doc/refman/5.1/en/innodb-physical-record.html:
对于每个非 NULL 可变长度字段,记录头包含
列的长度(以一或两个字节为单位)。两个字节只会
如果列的一部分存储在溢出页中或外部,则需要
最大长度超过255字节,实际长度超过127字节
字节。对于外部存储列,两字节长度表示
内部存储部分的长度加上指向的 20 字节指针
外部存储的部分。内部部分是768字节,所以
长度为768+20。 20字节的指针存储了真实的长度
柱子。
InnoDB 目前在其索引中不进行空间压缩,这与上面描述的 MyISAM 相反。
回到问题
然而,以上所有内容只是一个实现细节,甚至可能在版本之间发生变化。之间的真正区别CHAR
and VARCHAR
是语义的,之间的也是语义的VARCHAR(20)
and VARCHAR(50)
。通过确保无法在 a 中存储 30 个字符的字符串VARCHAR(20)
数据库使各种处理器和应用程序的生活变得更加轻松和更好地定义,据称它已集成到可预测行为的解决方案中。这是一件大事。
具体到个人姓名,这个问题 https://stackoverflow.com/questions/30485/what-is-a-reasonable-length-limit-on-person-name-fields可能会给你一些实用的指导。无论如何,全名超过 70 个 UTF-8 字符的人都会遇到麻烦。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)