2012-01-18 67 views
0

我对MySQL varchar数据类型有些怀疑。众所周知,比较MySQL varchar和IBM DB2 varchar dataype

char是一种固定长度的数据类型。因此,char值的存储大小等于该列的最大大小 。但是,对于“varchar”,它是一种可变长度数据类型,因此,varchar值的存储大小是输入数据的实际长度,而不是此列的最大大小。这就是为什么varchar通常在需要存储字符/文本类型的数据并保留未使用的内存以供将来使用时更多使用。

最近,我知道了......在IBM DB2的情况下,如果您在表的其余列的中间使用任何varchar列,那么该特定列中字符的存储大小等于orignal varchar列的大小。

EX:如果在表中有3列是这样的:

  1. 姓:炭(50)
  2. 名字:VARCHAR(50)
  3. EMAILID:炭(50)

因此,现在如果您想将此文本('Majhi')存储到数据类型为varchar(50)的coloumn“lastName”中,那么它将采用完整的50char存储大小,而不是仅采用5chars,这是实际的实际大小文本( 'Majhi')。

这就是为什么在IBM DB2中包含任何varchar数据类型的表颜色在其余颜色的中间也与char数据类型的作用相同。所以,内存优化不会发生。

所以,我只想知道我们的MySQL是以相同的方式工作,还是不能区分varchar dataype coloumn的存在和相应的工作,因为varchar数据类型列需要工作。

+1

如果该字段位于行的中间,那么DB2声明DB2将在varchar(50)中使用50个字符来存储'Mahji'是不正确的。它需要9个字节--5个为实际值,4个字节存储字符串的长度。如果列是可空的,则空指示符将会多出1个字节。 – 2012-01-18 17:19:50

回答

2

这里有两个方面。

第一个是磁盘存储。在这种情况下,对于每一行,只存储所需的数据,并且在varchar之后还有任何其他列并不重要。

第二个是加载到内存中的表。在这种情况下,MySQL内部将VARCHAR(n)转换为CHAR(m) [1],其中m是给定列中数据的最大长度。因此,如果您的列被声明为VARCHAR(60),但其中存储的最长字符串的长度为10,那么内存字段将具有固定长度10。这会在最小化内存占用量和最大限度地提高数据访问性能(如果您知道启动位置更容易获取特定列)之间达成折衷。

[1]:这里简化的种类。这不是一个CHAR或任何其他MySQL数据类型。

+0

另一个考虑因素是Unicode。字节数可能多于存储和磁盘中的字符数。 – zarchasmpgmr 2012-01-19 00:53:43