gpt4 book ai didi

Oracle10 和 JDBC : how to make CHAR ignore trailing spaces at comparision?

转载 作者:行者123 更新时间:2023-12-04 11:32:51 25 4
gpt4 key购买 nike

我有一个查询

... WHERE PRT_STATUS='ONT' ...



prt_status 字段被定义为 CHAR(5)。所以它总是用空格填充。查询结果不匹配。为了使这个查询工作我必须做

... WHERE rtrim(PRT_STATUS)='ONT'



这确实有效。

这很烦人。

同时,我的几个纯 Java DBMS 客户端(Oracle SQLDeveloper 和 AquaStudio)对第一个查询没有问题,它们返回正确的结果。 TOAD 也没有问题。

我认为他们只是将连接置于某种兼容模式(例如 ANSI),因此 Oracle 知道 CHAR(5) 期望与尾随字符进行比较。

如何使用我在应用程序中获得的 Connection 对象来做到这一点?

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

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

绑定(bind)完成后,字符串通过 PreparedStatement.setString() 传递,它将类型设置为 VARCHAR,因此 Oracle 使用未填充的比较——但失败了。

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

最终起作用的变体是
setObject(n,str,OracleTypes.FIXED_CHAR);

它使代码不可移植。

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

最佳答案

请注意 Oracle compares CHAR values using blank-padded comparison semantics.

来自 Datatype Comparison Rules ,

Oracle uses blank-padded comparison semantics only when both values in the comparison are either expressions of datatype CHAR, NCHAR, text literals, or values returned by the USER function.



在您的示例中,是 'ONT'作为绑定(bind)参数传递,还是如您所说明的那样以文本方式内置到查询中?如果是绑定(bind)参数,则确保它被绑定(bind)为类型 CHAR .否则,请验证所使用的客户端库版本,因为真正旧版本的 Oracle(例如 v6)对于 CHAR 将具有不同的比较语义。 .

关于Oracle10 和 JDBC : how to make CHAR ignore trailing spaces at comparision?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/603245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com