我有一个查询
... 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 将字段与传入参数进行比较的方式。
绑定完成后,字符串通过 PreparedStatement.setString() 传递,它将类型设置为 VARCHAR,因此 Oracle 使用未填充的比较——但失败了。
我尝试使用 setObject(n,str,Types.CHAR)。失败。反编译显示,Oracle 忽略了 CHAR 并再次将其作为 VARCHAR 传入。
最终起作用的变体是
setObject(n,str,OracleTypes.FIXED_CHAR);
它使代码不可移植。
UI 客户端成功的原因不同——它们使用字符文字,而不是绑定。当我输入 PRT_STATUS='ONT' 时,'ONT' 是一个文字,因此使用填充方式进行比较。