db2中varchar与long varchar类型的区别

昨天工作中遇到需要存储长度为32700个字符的字段,很明显,VARCHAR类型是不够用的,因为VARCHAR类型最多只能存储32672个字段。

于是改用LONG VARCHAR(32700),结果在建表时一直报莫名的错误。最后排查了很久,才发现是因为LONG VARCHAR类型不需要指定字符串的长度,而使用默认最大长度为32700。去掉LONG VARCHAR后的字符长度限定后,建表成功。

后面上网查了下VARCHAR与LONG VARCHAR,才了解到,区别还不仅仅是这些。

我们都知道,对于DB2来说,在创建表空间前,会先创建一个BUFFERPOOL(缓冲池)。BUFFERPOOL会有固定的PAGE SIZE(页大小),常用的用4K、8K、16K、32K。而创建表空间时,会指定使用哪一个BUFFERPOOL。这个BUFFERPOOL的PAGE SIZE就决定了表空间的PAGE SIZE。

这个PAGE SIZE,在一般情况下,我们是不太需要关心的。但在创建表时,表中所有字段的字段类型(比如DATE、INTEGER、VARCHAR、DECIMAL等)占用的字节长度之和,不可以超过这个PAGE SIZE的大小,否则会报错。

而除了上面LONG VARCHAR在定义时,不需要指定长度外,LONG VARCHAR还不会占用PAGE SIZE的大小。也就是说,在判断表中所有字段的字段类型占用的字节长度之和是否超过PAGE SIZE大小时,LONG VARCHAR类型是不计算在内的。也就是说,LONG VARCHAR类型字段的值,在操作时,是不经过BUFFER POOL的。

另外,LONG VARCHAR类型的字段,在使用时,还有不少的限制。在下面的SQL子句中是不允许使用LONG VARCHAR的:

  • DISTINCT
  • GROUP BY
  • ORDER BY
  • BETWEEN/IN
  • LIKE
  • 子查询内部
  • 列函数中
【版权说明:仅允许非商业转载且请注明出处:Mac私塾 网址:http://macsishu.com】

发表评论

邮箱地址不会被公开。

Captcha Code