假设有一个包含varchar字段的表,如下所示:
CREATE TABLE IF NOT EXISTS `users` (
`name` varchar(150) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
MySQL数据库大小是否依赖于varchar长度?我的意思是:当我将用户插入表中时,数据库大小是否会增加150个字节,与实际的条目内容无关?或者它取决于有效的数据大小(如果我插入" abc"作为用户名,数据库仅增加3个字节)?在决定varchar lenght时是否有最佳实践?
答案 0 :(得分:4)
不,不完全。
大多数常见的关系数据库使用称为“页面”的概念,这是一定大小的存储块。在这些页面中,然后存储行。根据其定义,varchar
字段仅占用字符串实际所需的存储空间,但可能需要或可能不需要新页面来包含其行。此外,在删除行时,添加和修改的间隙将显示在页面中,直到表格被优化或重复使用。这一切都很正常,因为DBMS本身在大多数情况下都能在内部保持高效。
总结:字段大小和数据库大小之间存在松散的关系,但数据库显然大于任何给定时间点的数据总和是正常的。但是,在大多数引擎中,具有10个字符数据的varchar(150)
将不会使用超过大约11个字节(取决于编码,并且包括尾随零)。
至于最佳做法:是的,varchar
的大小应该“合理地能够包含其域的最大可能字符串”。 varchar(1024)
对FirstName
字段没有意义,而varchar(16)
对City
不起作用。使用常识,存储无关紧要。
答案 1 :(得分:1)
VARCHAR值在存储时不会填充。存储和检索值时,将保留尾随空格,符合标准SQL。