【发布时间】:2009-03-02 17:39:28
【问题描述】:
我有一个查询
... 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' 是一个文字,因此使用填充方式进行比较。
【问题讨论】: