我在 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();
EDIT:现在这些是限制:
- 上述解决方法是不可取的,因为它修改了
c
and ?
,并且它使得使用索引c
挺难的。
- 将列从
CHAR
to VARCHAR
(当然应该如此)是不可能的
EDIT:这些限制的原因是因为我是从开发者的角度提出这个问题的jOOQ https://www.jooq.org,一个数据库抽象库。所以我的要求是提供一个非常通用的解决方案,不会破坏 jOOQ 客户端代码中的任何内容。这就是为什么我不太喜欢这种解决方法。这就是为什么我无法访问它CHAR
列的声明。但我仍然希望能够处理这个案子。
你会怎么做?处理的好习惯是什么CHAR
当我想忽略尾随空格时的数据类型?