Java 字符串 .length() X 不适合 DB2 varchar(X)



我观察到一个问题,我正在尝试将一条记录保存在 DB2 数据库中,其中字段在 Java 代码中具有长度检查。我已经保持长度检查完全等于数据库变量限制。并尝试保存但得到 SQL 异常 DB2 SQL 错误:SQLCODE=-302,SQLSTATE=22001,SQLERRMC=null,DRIVER=3.57.82;

然后,我将长度(截断(减小到小于数据库大小的长度。截断为子字符串 (0, 900( apprx 表示 varchar(1000(。

请让我说出同样的原因。它与字符编码有关吗?需要如何处理?

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

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

不幸的是,将字符串截断为字节

数的唯一方法是将其编码为字节,截断并重建字符串。从您所说的听起来像是使用了诸如 UTF-8 之类的可变长度编码。困难的部分是最后不生成无效字符,而做到这一点的方法是使用 NIO 字符集 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();

最新更新