Oracle JDBC通过占位符可以查询可变长字段,不可查询固定长度字段
这个问题在半年前,花了我两天的时间才解决,现在刚好想起来,顺便记录一下以防忘了。
通过jdbc,预编译的sql,无法查询到固定长度的字段。
用例子说话:
创建一个表,只有一个字段,长度为固定的char类型。并插入一条数据。
create table tblchar
( name char(20) );
在Java代码中使用预编译的SQL查询,无法查询到结果。而使用拼接的SQL,可以正常查询。

1 public static void main(String[] args) { 2 try { 3 Class.forName("oracle.jdbc.driver.OracleDriver"); 4 String url = "jdbc:oracle:thin:@localhost:1521:XE"; 5 Connection connection = DriverManager.getConnection(url, "sys as sysdba", 6 "Changeme123"); 7 8 PreparedStatement statement = connection.prepareStatement( 9 "select * from tblchar t where t.name = ?"); 10 statement.setString(1, "a"); 11 12 ResultSet resultSet = statement.executeQuery(); 13 System.out.println("first query result is :"); 14 while (null != resultSet && resultSet.next()) { 15 System.out.println(resultSet.getString(1)); 16 } 17 PreparedStatement statement2 = connection.prepareStatement( 18 "select * from tblchar t where t.name = 'a'"); 19 20 ResultSet resultSet2 = statement2.executeQuery(); 21 System.out.println("second query result is :"); 22 while (null != resultSet2 && resultSet2.next()) { 23 System.out.println(resultSet2.getString(1)); 24 } 25 connection.close(); 26 } catch (ClassNotFoundException e) { 27 // TODO Auto-generated catch block 28 e.printStackTrace(); 29 } catch (SQLException e) { 30 // TODO Auto-generated catch block 31 e.printStackTrace(); 32 } 33 }
运行结果如下:
可变长度的查询过程略,无数实践已证明是可以查询的。
结论:
数据库表在设计时,尽量少用固定长度。
1. 固定长度浪费空间 2. JDBC预编译语句无法查询结果。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现