PostgreSQL-JDBC疑似bug:部分接口参数的表名、列名必须全部小写
項目從Oracle移植到PostgreSQL(9.4版)后,這幾天又出現(xiàn)故障,經跟蹤定位,確定原因是調用PgDatabaseMetaData.getPrimaryKeys()接口返回了空集。
眾所周知,大多數(shù)情況下SQL語句對表名、列名都是大小寫不敏感(據(jù)本人經驗,linux平臺的MySql默認對表名區(qū)分大小寫,可算是個例外)。對應的,各數(shù)據(jù)庫JDBC也理應對大小寫不敏感,但實際情況是:PostgreSQL的JDBC的部分接口只認全部小寫的表名、列名,而對全大寫、大小寫混合的情況都不支持。
PostgreSQL在其數(shù)據(jù)字典里存放的都是全小寫的表名、列名,,但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。畢竟,其它主流數(shù)據(jù)庫的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一個類;另外猜測,模式名、用戶名、數(shù)據(jù)庫名等可能也在影響之列。
但因項目時間緊迫沒有核實,大家在使用時留心這個問題,在應用程序中加入大小寫轉換的代碼。
?
PS:最近在使用ODBC時發(fā)現(xiàn)存在同樣情況,組裝SQL時如果表名、列名、模式名等不是全小寫,會報Syntax Error,改成全小寫后正常。
轉載于:https://www.cnblogs.com/wggj/p/8005110.html
總結
以上是生活随笔為你收集整理的PostgreSQL-JDBC疑似bug:部分接口参数的表名、列名必须全部小写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring在WEB中的应用。
- 下一篇: mysql 关联关系