zoukankan      html  css  js  c++  java
  • PostgreSQL-JDBC疑似bug:部分接口参数的表名、列名必须全部小写

    项目从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,改成全小写后正常。

  • 相关阅读:
    WPF入门教程系列十二——依赖属性(二)
    WPF入门教程系列十一——依赖属性(一)
    WPF入门教程系列十——布局之Border与ViewBox(五)
    WPF入门教程系列九——布局之DockPanel与ViewBox(四)
    WPF入门教程系列八——布局之Grid与UniformGrid(三)
    WPF入门教程系列七——布局之WrapPanel与StackPanel(二)
    WPF入门教程系列六——布局介绍与Canvas(一)
    WPF入门教程系列五——Window 介绍
    WPF入门教程系列四——Dispatcher介绍
    WPF入门教程系列三——Application介绍(续)
  • 原文地址:https://www.cnblogs.com/wggj/p/8005110.html
Copyright © 2011-2022 走看看