gpt4 book ai didi

Oracle JDBC 和 Oracle CHAR 数据类型

转载 作者:行者123 更新时间:2023-12-02 01:30:17 26 4
gpt4 key购买 nike

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 执行这些查询时也是如此。现在棘手的事情是当我想使用绑定(bind)变量时:

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();

编辑:现在这些是限制:

  • 上述解决方法并不可取,因为它同时修改了 c? 的内容,并且使得在 c 上使用索引变得非常困难.
  • 无法将列从 CHAR 移动到 VARCHAR(当然应该如此)

编辑:这些限制的原因是因为我是从jOOQ的开发者的角度提出这个问题的。 ,一个数据库抽象库。所以我的要求是提供一个非常通用的解决方案,不会破坏 jOOQ 客户端代码中的任何内容。这就是为什么我不太喜欢这种解决方法。这就是为什么我无法访问该 CHAR 列的声明。但我仍然希望能够处理这个案子。

你会怎么做?当我想忽略尾随空格时,处理 CHAR 数据类型的好习惯是什么?

最佳答案

如果你愿意

stmt.setString(1, "a");    // This won't return any records

要返回一条记录,请尝试

conn.prepareStatement("select * from x where c = cast(? as char(4))")

关于Oracle JDBC 和 Oracle CHAR 数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57557138/

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