Oracle10和JDBC:如何使CHAR在比较时忽略尾随空格?

Oracle10和JDBC:如何使CHAR在比较时忽略尾随空格?,oracle,jdbc,char,Oracle,Jdbc,Char,我有一个问题已经解决了 。。。其中PRT_STATUS='ONT' 但prt_状态字段定义为CHAR(5)。所以它总是用空格填充。查询与结果不匹配。要使这个查询工作正常,我必须执行以下操作 。。。其中rtrim(PRT_状态)=“ONT” 这确实有效 真烦人 同时,我的两个纯java DBMS客户机(Oracle SQLDeveloper和AquaStudio)在第一个查询中没有问题,它们返回正确的结果。蟾蜍也没有问题 我假定他们只是将连接置于某种兼容模式(例如ANSI),因此Oracle知道C

我有一个问题已经解决了

。。。其中PRT_STATUS='ONT'

但prt_状态字段定义为CHAR(5)。所以它总是用空格填充。查询与结果不匹配。要使这个查询工作正常,我必须执行以下操作

。。。其中rtrim(PRT_状态)=“ONT”

这确实有效

真烦人

同时,我的两个纯java DBMS客户机(Oracle SQLDeveloper和AquaStudio)在第一个查询中没有问题,它们返回正确的结果。蟾蜍也没有问题

我假定他们只是将连接置于某种兼容模式(例如ANSI),因此Oracle知道CHAR(5)预期会与尾随字符进行比较,而不考虑尾随字符

如何处理应用程序中的连接对象?

更新我无法更改数据库架构

解决方案这确实是Oracle将字段与传入参数进行比较的方式

绑定完成后,字符串通过PreparedStatement.setString()传递,该语句将type设置为VARCHAR,因此Oracle使用未添加的比较,结果失败

我尝试使用setObject(n,str,Types.CHAR)。失败。反编译显示Oracle忽略CHAR,并将其作为VARCHAR再次传入

最终起作用的变体是

setObject(n,str,OracleTypes.FIXED_CHAR);
但这使得代码不可移植

UI客户端成功的原因不同——它们使用字符文本,而不是绑定。当我键入PRT_STATUS='ONT','ONT'是一个文本,因此使用填充方式进行比较。

我会将CHAR(5)列更改为varchar2(5),以db为单位

注意

Oracle使用空白填充比较 仅当 比较是 数据类型CHAR、NCHAR、文本文字、, 或用户返回的值 功能


在您的示例中,
'ONT'
是作为绑定参数传递的,还是如您所示,它以文本方式内置到查询中?如果是bind参数,请确保将其绑定为type
CHAR
。否则,请验证所使用的客户端库版本,因为真正旧版本的Oracle(例如v6)将对
CHAR

具有不同的比较语义。如果无法更改数据库表,则可以修改查询

RTRIM的一些替代方案:

。。其中PRT_状态如“ONT%”

。。其中PRT_状态='ONT'…--T后面有2个空格

。。其中PRT_STATUS=rpad('ONT',5',)


您可以在查询中使用cast to char操作:

... WHERE PRT_STATUS=cast('ONT' as char(5))
或者以更通用的JDBC方式:

... WHERE PRT_STATUS=cast(? as char(5))

然后在JDBC代码中使用
statement.setString(1,“ONT”)

毫无疑问。DB不属于我们组。嗯。。。这是有道理的。JDBC的setString使用VARCHAR绑定字符串参数。我不确定是否可以用它来解决这个问题,但至少现在它变得更清楚了。您可能是对的:“只要比较中的一个或两个值的数据类型为VARCHAR2或NVARCHAR2,Oracle就会使用非添加的比较语义”。我需要做个测试来检查。谢谢,弗拉德!请参阅上面我的解决方案。很高兴问题已解决!v