【发布时间】:2012-01-18 08:26:45
【问题描述】:
我对 MySQL varchar 数据类型有点怀疑。众所周知。
char 是固定长度的数据类型。因此,char 值的存储大小等于
列的最大大小。但是,在“varchar”的情况下,它是一个可变长度的数据类型,
因此,varchar 值的存储大小是输入数据的实际长度,而不是该列的最大大小。这就是为什么varchar 通常在需要存储字符/文本类型的数据并保留未使用的内存以供将来使用时更常用。
最近,我知道...对于 IBM DB2,如果您在表的其余列中间使用任何 varchar 列,那么该特定列中字符的存储大小等于varchar 列的原始大小。
EX:如果在一个表中有 3 列是这样的:
- 名字:char(50)
- 姓氏:varchar(50)
- emailId : char(50)
所以,现在如果您想将此文本('Majhi')存储到数据类型为 varchar(50) 的列“lastName”中,那么它将占用完整的 50char 存储大小,而不是仅占用实际大小的 5chars的实际文本('Majhi')。
这就是为什么在 IBM DB2 中,包括任何 varchar 数据类型的 coloumn 位于表 whill 的其余列的中间也与 char 数据类型的工作方式相同。所以,内存优化不会发生。
所以,我只想知道我们的 MySQL 是否以相同的方式工作,或者它不会区分 varchar 数据类型列存在的位置并相应地工作,因为 varchar 数据类型列需要工作。
【问题讨论】:
-
如果该字段位于行的中间,您断言 DB2 将使用 varchar(50) 中的 50 个字符存储“Mahji”是不正确的。它需要 9 个字节 - 5 个字节用于实际值,4 个字节用于存储字符串的长度。如果该列可以为空,则空指示符将多出 1 个字节。