DB2的长字段解决办法

在DB2中,有时候需要建立如下种类的表:
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;


终于,一切正常了.

转载于:https://www.cnblogs.com/millen/archive/2011/10/14/2212347.html

<think>我们正在讨论DB2数据库中用于存储文本的数据类型。 根据引用[1]:在PostgreSQL中可以使用TEXT数据类型,但在DB2中,如果存储的值的最大度小于32K,将TEXT列迁移为CLOB可能不是最好的选择。迁移工具会检查数据并进行转换。 另外,引用[2]中提到了CLOB数据类型的使用,并且指定了大小(如2M),说明DB2中可以使用CLOB来存储大文本。 引用[3]中没有直接提到文本类型,但我们可以综合已有引用得出结论。 因此,DB2中用于存储文本的数据类型主要是CLOB(Character Large Object)。它可以存储非常大的字符数据,最大可以达到2GB(具体取决于DB2的版本和配置)。 此外,DB2还有其他的字符串类型: - CHAR(n):固定度字符串,最多可存储254个字符。 - VARCHAR(n):可变度字符串,最大度取决于页大小(例如,在4K页上最多可存储4000个字符,在32K页上最多可存储32704个字符)。 - CLOB:用于存储非常大的字符数据,最大度以GB计。 所以,对于文本,我们通常使用CLOB。 但是,需要注意的是,如果文本度不是特别大(例如小于32K),也可以考虑使用VARCHAR,因为VARCHAR在操作上可能更简单。但超过VARCHAR的最大度时,就必须使用CLOB。 另外,引用[2]中有一个例子:创建表时使用`stmt clob(2M)`,这表示创建一个最大度为2MB的CLOB列。 总结:DB2中存储文本的数据类型是CLOB。 相关问题: 1. CLOB类型在DB2中的最大存储容量是多少? 2. 在DB2中如何优化CLOB类型的查询性能? 3. DB2中CLOB类型和VARCHAR类型的主要区别是什么?</think>在DB2数据库中,存储文本的**首选数据类型是CLOB(Character Large Object)**。以下是关键要点: ### 1. **CLOB数据类型** - **容量**:最大支持 **2GB** 的文本数据(具体上限取决于DB2版本和配置) - **语法**: ```sql CREATE TABLE table_name ( id INT PRIMARY KEY, long_text CLOB(500K) -- 指定最大度(可选) ); ``` - **适用场景**:存储文档、日志、JSON/XML等超过32KB的文本[^1][^2] ### 2. **替代方案(小文本)** - 若文本 **< 32KB**,优先使用 `VARCHAR`: ```sql -- 最大32KB(取决于页大小) long_text VARCHAR(32672) ``` - 原因:`VARCHAR` 比 `CLOB` 操作更高效,支持更多函数(如 `UPPER()`)[^1][^2] ### 3. **使用注意事项** - **函数限制**:部分字符串函数(如 `UPPER()`)对 `CLOB` 支持有限,可能报错 `SQL0433N`[^2] - **迁移兼容**:从MySQL/PostgreSQL迁移时,`TEXT` 类型会自动转为 `CLOB`[^1] - **性能优化**:对大文本建立辅助索引或使用压缩 > ⚠️ 注意:DB2没有原生的 `TEXT` 类型,文本必须用 `CLOB`[^1][^2]。 --- ### 相关问题 1. 如何解决DB2中`CLOB`类型使用`UPPER()`函数报错的问题? 2. 从MySQL迁移到DB2时,`TEXT`字段会自动转换为什么数据类型? 3. `CLOB`和`VARCHAR`在DB2中的性能差异有哪些? [^1]: PostgreSQL的`TEXT`迁移到DB2时会转为`CLOB`,但小于32KB的文本建议用`VARCHAR` [^2]: `CLOB`使用`UPPER()`函数可能因超长报错`SQL0433N` [^3]: DB2表结构定义示例(含自增主键)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值