【发布时间】:2011-08-16 11:45:14
【问题描述】:
我有以下代码从 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
谢谢
【问题讨论】:
-
您确定字符串被“截断”还是只是在终端/控制台上看到控制字符的结果?与数据库中的数据相比,字符串的长度是多少?
-
是的,我运行一个 sql 查询,在 sqlplus 上,length("MESSAGE_DATA") 返回 2032,而在 java message.getString(1).length() 中返回 2000。
-
我认为
8.x版本很可能已被取消支持,因此请务必使用 10.x 驱动程序。 -
版本差异是否会导致任何问题? IE。驱动是 10.2.0.1 但数据库是 10.1?我查看了 oracle 站点 oracle.com/technetwork/database/features/jdbc/index-091264.html 并找不到 10.1..0.3 的驱动程序 他们有 10.1.0.2 也许这是更好的选择?
-
@Ziggy:完全没问题。如果您愿意,您甚至可以使用 11.x 驱动程序。
标签: java oracle jdbc jakarta-ee