考虑两个列类型声明:
VARCHAR(20) и VARCHAR(150)
除了限制数据的长度外,还有什么区别吗?例如,使用第二个选项,表会更重,即使列中的所有值都是 NULL 或其他类似的东西?
此外,例如,通常指定一个可以为 true 或 false 的类型——它们开始一个列TINYINT(1)
,而不是TINYINT(255)
。毕竟TINYINT
,无论如何它都需要 1 个字节,不是吗?
一般来说,我想知道这些记录有什么不同。如果列占用的字节数与规范中指示的一样多(在我看来),那么限制列的好处是什么?它加载到内存中的数量更少还是数据的物理重量更轻?
一般来说,很难给出答案,因为在不同的DBMS中实现方法可能不同。我将以 MySQL 为例进行回答,因为有文档和源代码。
VARCHAR
需要与用户保存的字节数完全相同的字节数,加上用于存储字符串长度的字节数。最大长度为255,MySQL分配1字节,超过255,分配2字节。类型的空字符串 ''
VARCHAR(100)
将占用 1 个字节(将存储字符串 0 的长度),对于类型VARCHAR(300)
- 2 个字节(还将存储字符串 0 的长度,但范围从 0 到65535)。字符串 'abcd' 将分别占用 5 和 6 个字节。VARCHAR
因此,您可以通过将字段的长度减少到 255 个字符来为每个条目节省 1 个字节。实际上,考虑到云中 1 TB 数据的成本(每年约10 美元) ,这没有意义。依赖域更实用,维护方便,维护者
TINYINT(1)
告诉第一次看到代码的程序员,我们存储的是一个布尔值,而不是一个小整数。他很快就明白了这个领域的用途。VARCHAR(8000)
对于 URL 存储由 RFC-7230 标准证明是合理的: