昨天工作中遇到需要存储长度为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
- 子查询内部
- 列函数中