我对MySQL varchar
数据类型有一点疑问。我们都知道。
char
是固定长度的数据类型。因此,char值的存储大小等于
列的最大大小。但是,在“varchar”的情况下,它是一个可变长度的数据类型,
因此,varchar
值的存储大小是输入数据的实际长度,而不是此列的最大大小。这就是为什么varchar
通常在需要存储字符/文本类型的数据并保留未使用的内存以供将来使用时更常用。
最近,我知道...如果是IBM DB2,如果在表的其余列中间使用任何varchar
列,则该特定列中字符的存储大小相等到varchar
列的原始大小。
EX:如果在表中有3列如下:
所以,现在如果你想将这个文本('Majhi')存储到coloumn“lastName”数据类型varchar(50)
中,那么它将占用50char的存储大小,而不是只采用5chars,这就是实际文本的实际大小('Majhi')。
这就是为什么,在IBM DB2中包含任何varchar数据类型coloumn,其余表格中间的coloumns也可以与char
数据类型一样工作。因此,内存优化不会发生。
所以,我只是想知道我们的MySQL是否以相同的方式工作,或者它没有区分varchar
dataype coloumn存在的位置,因此varchar
数据类型列需要工作。< / p>
答案 0 :(得分:2)
这里有两个方面。
第一个是磁盘存储。在这种情况下,每行只存储所需的数据,如果varchar之后还有其他列,则不重要。
第二个是加载到内存中的表。在这种情况下,MySQL会在内部将VARCHAR(n)
转换为CHAR(m)
[1],其中m
是给定列中的最大数据长度。因此,如果您的列声明为VARCHAR(60)
,但存储在其中的最长字符串的长度为10
,则内存中字段的长度将固定为10
。这样可以在最小化内存占用和最大化数据访问性能之间达成妥协(如果您知道它的起始位置,则更容易获取特定列。)
[1]:这里有一种简化。它实际上不是CHAR
或任何其他MySQL数据类型。