PostgreSQL-JDBC疑似bug:部分介面參數的表名、列名必須全部小寫

來源:互聯網
上載者:User

標籤:class   情況下   支援   pid   pen   經驗   get   包括   sch   

項目從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_namefrom 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.atttypidwhere 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一個類;另外猜測,模式名、使用者名稱、資料庫名等可能也在影響之列。

但因項目時間緊迫沒有核實,大家在使用時留心這個問題,在應用程式中加入大小寫轉換的代碼。

 

PostgreSQL-JDBC疑似bug:部分介面參數的表名、列名必須全部小寫

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.