我有一个的Oracle JDBC驱动程序在处理一个棘手的问题, CHAR
数据类型。 让我们以这个简单的表:
create table x (c char(4));
insert into x (c) values ('a'); -- inserts 'a '
所以,当我的东西插入到CHAR(4)
字符串总是充满着空白。 当我执行这样的查询,也会这样做:
select * from x where c = 'a'; -- selects 1 record
select * from x where c = 'a '; -- selects 1 record
select * from x where c = 'a '; -- selects 1 record
这里,常数'a'
充满了空格为好。 这就是为什么总是返回记录。 当这些查询使用JDBC执行此成立PreparedStatement
也是如此。 现在棘手的事情是,当我想使用绑定变量:
PreparedStatement stmt =
conn.prepareStatement("select * from x where c = ?");
stmt.setString(1, "a"); // This won't return any records
stmt.setString(1, "a "); // This will return a record
stmt.executeQuery();
这是一种解决方法:
PreparedStatement stmt =
conn.prepareStatement("select * from x where trim(c) = trim(?)");
stmt.setString(1, "a"); // This will return a record
stmt.setString(1, "a "); // This will return a record
stmt.executeQuery();
编辑 :现在这些都是制约因素:
- 上述解决办法是不是desireable,因为它同时修改的内容
c
和?
,这让使用索引上的c
挺难的。 - 移动从柱
CHAR
到VARCHAR
(它应该是,当然)是不可能的
编辑 :这些限制的原因是因为我但从开发商的角度问这个问题jOOQ ,数据库抽象库。 所以,我的要求是提供一个非常通用的解决方案,不打破jOOQ的客户端代码什么。 这就是为什么我不是一个真正的解决办法的大风扇。 这就是为什么我没有访问该CHAR
列的声明。 但是,我希望能够处理这种情况。
你会怎么做呢? 什么是处理一个很好的做法CHAR
数据类型时,我想忽略尾随空白?