JDBC从包含控制字符的数据库表中读取数据

时间:2011-05-01 15:03:27

标签: java oracle jdbc java-ee

我有以下一些代码从Oracle表中读取数据(注意:这在Jdk 1.4.2上运行)

ResultSet message = messageStatement.executeQuery(getMsgSql);
String messageData = message.getString("MESSAGE_DATA");

MESSAGE_DATA列中的数据包含文本,但也包含分隔消息中数据元素的控制字符(即(char)31,(char)29)和(char)28)。

我发现的是,由于某种原因,message.getString()有时会截断消息。我可以读取大部分消息,但其中一些消息被截断。我应该使用不同的方法读取数据吗?如果是这样的话?

我曾尝试使用sqlplus来查看数据库中的数据,并且它只是被message.getString()方法截断。我在尝试输出结果时看到了这一点,即System.out.println(message.getString())。

由于

更新

我使用Oracle中的length()函数运行sql查询,而length(“MESSAGE_DATA”)返回2032而在java message.getString(1).length()中返回2000.我不知道为什么会发生这种情况。

更新

好的,我可能会想到一些事情。我刚刚尝试了更新版本的JDBC驱动程序,它似乎正在运行。正在使用的驱动程序是为jdk1.4交付而交付的旧版本。有谁知道为什么会这样?而且,使用较新版本的jdbc驱动程序会产生任何影响,特别是考虑到应用程序在JDK 1.4上运行。 oracle版本是10.1.0.3.0

更新

我不确定这是否有用,但这里是两个JDBC驱动程序的版本。

无效的JDBC驱动程序

=====  Database info =====
DatabaseProductName: Oracle
DatabaseProductVersion: Oracle Database 10g Release 10.1.0.3.0 - 64bit Production
=====  Driver info =====
DriverName: Oracle JDBC driver
DriverVersion: 8.0.5.2.0
DriverMajorVersion: 8
DriverMinorVersion: 0

运行的JDBC驱动程序

=====  Database info =====
DatabaseProductName: Oracle
DatabaseProductVersion: Oracle Database 10g Release 10.1.0.3.0 - 64bit Production
=====  Driver info =====
DriverName: Oracle JDBC driver
DriverVersion: 10.2.0.1.0
DriverMajorVersion: 10
DriverMinorVersion: 2

由于

1 个答案:

答案 0 :(得分:2)

我的猜测:数据库有一个非默认的字符集。如果Java驱动程序不知道该charset,它将期望默认(无论它是什么),并且解码错误,有时可能截断字符串。