DB2的长字段解决办法
在DB2中,有时候需要建立如下种类的表:
T_1(id varchar(50),data varchar(8000))
因此需要执行create table T_1(id varchar(50),data varchar(8000));
通常情况下,这个语句不会执行成功的.
如下:
顾名思义,DB2默认的页大小是4K,这样的表的字段太长,接近8K.一条记录不能跨页存储.
所以我们需要创建一个页长为8K的表空间.
首先,创建8K的缓冲池:
然后,使用该缓冲池创建一个表空间
接下来执行
顺利通过
在DB2的CLP环境下,可以进行正常的insert,select等操作,但是在JDBC环境下就不行了.
在Eclipse的DBEdit(也是通过JDBC)下执行select操作时候报:
因此,需要再创建一个系统临时表空间才能让DB2 shut up.
终于,一切正常了.
T_1(id varchar(50),data varchar(8000))
因此需要执行create table T_1(id varchar(50),data varchar(8000));
通常情况下,这个语句不会执行成功的.
如下:
C:\Documents and Settings\Administrator>db2 create table T_1(id varchar(50),data varchar(8000))
DB21034E 该命令被当作 SQL
语句来处理,因为它不是有效的“命令行处理器”命令。在 SQL 处理期间,它返回:
SQL0286N 找不到页大小至少为 "8192"、许可使用授权标识 "VM" 的缺省表空间。
顾名思义,DB2默认的页大小是4K,这样的表的字段太长,接近8K.一条记录不能跨页存储.
所以我们需要创建一个页长为8K的表空间.
首先,创建8K的缓冲池:
create bufferpool ibmdefault8k IMMEDIATE SIZE 5000 PAGESIZE 8 K ;
然后,使用该缓冲池创建一个表空间
CREATE TABLESPACE mytbs
IN DATABASE PARTITION GROUP IBMDEFAULTGROUP
PAGESIZE 8K
MANAGED BY SYSTEM
USING
('D:\DB2\mycontainer'
)
EXTENTSIZE 32
PREFETCHSIZE 16
BUFFERPOOL IBMDEFAULT8K
OVERHEAD 24.10
TRANSFERRATE 0.90
DROPPED TABLE RECOVERY OFF;
GRANT USE OF TABLESPACE mytbs TO PUBLIC;
接下来执行
create table T_1(id varchar(50),data varchar(8000));
顺利通过
在DB2的CLP环境下,可以进行正常的insert,select等操作,但是在JDBC环境下就不行了.
在Eclipse的DBEdit(也是通过JDBC)下执行select操作时候报:
[IBM][CLI Driver][DB2/NT] SQL1585N 不存在具有足够页大小的系统临时表空间。 SQLSTATE=54048
dbedit.core.DataException: Unable to retrieve result values for VM.T_1
dbedit.core.DataException: Couldn't execute query:select "ID","DATA" from "VM"."T_1"
COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver][DB2/NT] SQL1585N 不存在具有足够页大小的系统临时表空间。 SQLSTATE=54048
因此,需要再创建一个系统临时表空间才能让DB2 shut up.
CREATE TEMPORARY TABLESPACE mysystmp1
IN DATABASE PARTITION GROUP IBMTEMPGROUP
PAGESIZE 8K
MANAGED BY SYSTEM
USING
('D:\DB2\tttt'
)
EXTENTSIZE 32
PREFETCHSIZE 16
BUFFERPOOL IBMDEFAULT8K
OVERHEAD 24.10
TRANSFERRATE 0.90
DROPPED TABLE RECOVERY OFF;
终于,一切正常了.