2

我观察到一个问题,我试图在 DB2 数据库中保存一条记录,其中包含在 Java 代码中进行长度检查的字段。我保持长度检查完全等于数据库 varchar 限制。并试图保存但得到 SQL Exception DB2 SQL Error: SQLCODE=-302, SQLSTATE=22001, SQLERRMC=null, DRIVER=3.57.82;

然后我减少了长度(截断)长度小于数据库大小。为 varchar(1000) 截断为子字符串 (0, 900) apprx。

请告诉我可能是什么原因。它与字符编码有关吗?需要如何处理?

应用于字符串的默认字符编码是什么(从文本区域字段的请求参数输入)和相应的编号。字节数?

4

1 回答 1

3

DB2 以字节为单位计算字符串长度,而不是字符。因此,您可以存储的字符串的最大长度可能比为 varchar 指定的大小短很多。

不幸的是,将字符串截断为多个字节的唯一方法是将其编码为字节,截断并重建字符串。从您所说的情况来看,这听起来像是在使用可变长度编码,例如 UTF-8。困难的部分是最后不会产生无效字符,而做到这一点的方法是使用 NIO charset API:

import java.nio.*;
...
CharBuffer in = CharBuffer.wrap(stringToTruncate);
ByteBuffer out = ByteBuffer.allocate(maxLength);
Charset db2charset = Charset.forName("UTF-8");
CharsetEncoder db2encoder = db2charset.newEncoder();
db2encoder.encode(in, out, true);
out.flip();
return db2charset.decode(out).toString();
于 2013-10-09T19:10:41.363 回答