项目从Oracle移植到PostgreSQL(9.4版)后,这几天又出现故障,经跟踪定位,确定原因是调用PgDatabaseMetaData.getPrimaryKeys()接口返回了空集。

众所周知,大多数情况下SQL语句对表名、列名都是大小写不敏感(据本人经验,linux平台的MySql默认对表名区分大小写,可算是个例外)。对应的,各数据库JDBC也理应对大小写不敏感,但实际情况是:PostgreSQL的JDBC的部分接口只认全部小写的表名、列名,而对全大写、大小写混合的情况都不支持。

PostgreSQL在其数据字典里存放的都是全小写的表名、列名,,但JDBC的接口在处理时却没有进行大小写转换。以下是参考PostgreSQL-JDBC的源码而改造得来的查询某表主键的SQL代码:

select pg_attribute.attname as colname,pg_type.typname as typename,pg_constraint.conname as pk_name
from pg_constraint
inner join pg_class on pg_constraint.conrelid = pg_class.oid
inner join pg_attribute on pg_attribute.attrelid = pg_class.oid and  pg_attribute.attnum = pg_constraint.conkey[1]
inner join pg_type on pg_type.oid = pg_attribute.atttypid
where pg_class.relname = 'table_name' and pg_constraint.contype='p';

当table_name为全小写时,可以获得正确结果,其它情况结果均为空。

也许PostgreSQL方面因某种原因而刻意为之,但本人倾向于认为这是bug。毕竟,其它主流数据库的JDBC都能正确应对这种情况。

经简单测试,本项目涉及的接口包括:

//获取表主键
public ResultSet getPrimaryKeys(String catalog, String schema, String table)  throws SQLException;//获取表外键
public ResultSet getImportedKeys(String catalog, String schema, String table)  throws SQLException;//获取列名
public String getColumnName(int column);

受影响的接口应该还有不少,很可能也不止PgDatabaseMetaData一个类;另外猜测,模式名、用户名、数据库名等可能也在影响之列。

但因项目时间紧迫没有核实,大家在使用时留心这个问题,在应用程序中加入大小写转换的代码。

PS:最近在使用ODBC时发现存在同样情况,组装SQL时如果表名、列名、模式名等不是全小写,会报Syntax Error,改成全小写后正常。

转载于:https://www.cnblogs.com/wggj/p/8005110.html

PostgreSQL-JDBC疑似bug:部分接口参数的表名、列名必须全部小写相关推荐

  1. MYSQL使用存储过程插入中文数据的疑似bug(UTF8)

    数据库Connection和字段的字符集都采用utf-8. 开始使用存储过程插入数据,代码大约如下 MySqlCommand cmd = new MySqlCommand("apend_te ...

  2. mysql存储过程参数与属性同名问题_存储过程中参数与表名相同的二义性问题

    写了一个很简单的存储过程,发现执行了,但是表的数据没有改变,存储过程如下: procedure sp_upd_update_jsgl(mc in varchar2,--名称 sm in varchar ...

  3. mysql中存储过程 解决参数作为表名

    关键字: mysql 存储过程 1.用变量做表名: 简单的用set或者declare语句定义变量,然后直接作为sql的表名是不行的,mysql会把变量名当作表名.在其他的sql数据库中也是如此,mss ...

  4. Python的win32serviceutil之疑似BUG

    郑昀@玩聚SR 20090515 1.现象: 用Python的win32serviceutil控制Windows Service启动.停止.重启时,如下代码一般是没问题的. import win32s ...

  5. 疑似Bug:简书安卓10.7首页搜索关键字屏蔽敏感词不彻底

    安卓10.7版本Bug截图 对比: 对比简书首页搜索敏感词"政治"和非敏感词"时事政治" 2016.5.23更新: 更新到安卓10.8正式版后已经可以直接搜索关 ...

  6. 实际例子描述和分析“猎豹抢票跨站推荐功能跨站有票刷不到”的疑似bug

    前言 快过年了,又到了一年抢票时.今年douba和douma计划要带着doudou回姥姥家.昨天在家用抢票软件居然发现了一个bug,那就是在猎豹抢票中跨站推荐的车票几天里一直是没有,但是在12306手 ...

  7. 实际例子描述和分析“猎豹抢票跨站推荐功能有票刷不到”的疑似bug

    前言 快过年了,又到了一年抢票时.今年douba和douma计划要带着doudou回姥姥家.昨天在家用抢票软件居然发现了一个bug,那就是在猎豹抢票中跨站推荐的车票几天里一直是没有,但是在12306手 ...

  8. mybatis:通过参数传表名、select字段

    <select id="findpro" resultType="java.lang.String" parameterType="java.u ...

  9. 天文学家首次发现疑似宜居星球(组图)

    核心提示:由11名欧洲科学家组成的天文观测组4月24日宣布,他们首次在太阳系之外发现了一颗可能适合人类 居住的星球.这颗星球有类似地球的温度,大小也跟地球差不多,可能还有水,距离地球大约120万亿英里 ...

最新文章

  1. SVD(奇异值分解)小结
  2. 幼儿园python_[Python]猜数字游戏AI版的实现(幼儿园智商AI)
  3. 代码高亮_微信公众号代码高亮美化工具 Markdown Nice
  4. access vba表字段_Access获取表字段的所有属性信息
  5. BufferedReader 中的 readLine()
  6. html5判断设备的动作
  7. r语言 中断r的输入_R语言_004数据输入
  8. Java多线程详解(线程池)
  9. python数据1-4
  10. 谈谈VIP漂移那点破事
  11. 动态规划之LIS(最长上升子序列)
  12. 找不到任何设备驱动程序.请确保安装介质_win10安装完全手册,详细全面,新手必备...
  13. CA数字证书包含哪些文件?如何查看SSL证书信息?
  14. 适合外贸建站的wordpress模板
  15. s3f9454可c语言编程,微处理器S3F9454BZZ-DK94
  16. 蓝牙芯片解决方案市场规模
  17. 完美时空客服自助平台SQL注射漏洞
  18. Linux 简要大纲
  19. 50例大数据术语英文翻译及详解
  20. 查找mac系统下的隐藏文件以及隐藏文件夹的方法

热门文章

  1. CCF NOI1150 确定进制
  2. 专业写博一天------ArrayList 线程安全
  3. Java集合源码学习(四)HashMap
  4. uva 299 - Train Swapping
  5. Win2008 server backup系统备份组件安装
  6. Spark学习之路 (十五)SparkCore的源码解读(一)启动脚本
  7. Oracle统计信息不准(谓词越界)造成的性能问题
  8. PHP成为首个在内核中嵌入加密库的编程语言
  9. SQL SERVER 2012 修改数据库默认位置不立即生效
  10. 电商:流量不再重要,渠道终将为王