今日もプログラミング

IT技術とかプログラミングのこととか特にJavaを中心に書いていきます

OracleのJDBC型を調べてみたら大変だった

Javaでデータベースに関するツールを作るときに便利なのがjava.sql.DatabaseMetaData。

これを使うとテーブルの情報とかカラムの情報などいろいろ取れる。

しかし、面倒なのは、DBMSの型がJDBCのどの型にマッピングされているかだ(JDBCの型はjava.sql.Typesで列挙されている)。

マッピングDBMSによってもちろん違うし(そもそもDBMSによって型が違うし)、JDBCドライバのバージョンによっても違うことがある。

 

今回は、とりあえずOracleについて調べてみた。

Oracleのバージョンは12.1.0.1.0(Windows)。

JDBCドライバは、11.1.0.7.0、11.2.0.4、12.1.0.1、12.1.0.2の4つをダウンロードして調べてみた。

その結果がこれ。

DBMSTYPE_NAMEDATA_TYPECOLUMN_SIZEDECIMAL_DIGITS
CHAR(10) CHAR Types.CHAR 10 0
CHAR(10 CHAR) CHAR Types.CHAR 10 0
NCHAR(10) NCHAR Types.NCHAR (12.1.0.2) Types.OTHER (12.1.0.1以前) 10 0
VARCHAR2(10) VARCHAR2 Types.VARCHAR 10 0
VARCHAR2(10 CHAR) VARCHAR2 Types.VARCHAR 10 0
NVARCHAR2(10) NVARCHAR2 Types.NVARCHAR (12.1.0.2) Types.OTHER (12.1.0.1以前) 10 0
NUMBER NUMBER Types.DECIMAL 0 (11.2.0.4以降) 22 (11.1.0.7.0) -127 (11.2.0.4以降) 0 (11.1.0.7.0)
NUMBER(2,0) NUMBER Types.DECIMAL 2 0
NUMBER(4,2) NUMBER Types.DECIMAL 4 2
FLOAT FLOAT Types.FLOAT 126 0
FLOAT(8) FLOAT Types.FLOAT 8 0
BINARY_FLOAT BINARY_FLOAT 100 4 0
BINARY_DOUBLE BINARY_DOUBLE 101 8 0
LONG LONG Types.LONGVARCHAR 0 0
DATE DATE Types.TIMESTAMP 7 0
TIMESTAMP TIMESTAMP(6) Types.TIMESTAMP 11 6
TIMESTAMP(0) TIMESTAMP(0) Types.TIMESTAMP (12.1.0.2) Types.OTHER (12.1.0.1以前) 7 0
TIMESTAMP(6) TIMESTAMP(6) Types.TIMESTAMP 11 6
TIMESTAMP(9) TIMESTAMP(9) Types.TIMESTAMP (12.1.0.2) Types.OTHER (12.1.0.1以前) 11 9
TIMESTAMP WITH TIME ZONE TIMESTAMP(6) WITH TIME ZONE -101 13 6
TIMESTAMP(6) WITH TIME ZONE TIMESTAMP(6) WITH TIME ZONE -101 13 6
TIMESTAMP(n) WITH TIME ZONE (n≠6) TIMESTAMP(n) WITH TIME ZONE -101 (12.1.0.2) Types.OTHER (12.1.0.1以前) 13 n
TIMESTAMP WITH LOCAL TIME ZONE TIMESTAMP(6) WITH LOCAL TIME ZONE -102 11 6
TIMESTAMP(6) WITH LOCAL TIME ZONE TIMESTAMP(6) WITH LOCAL TIME ZONE -102 11 6
TIMESTAMP(n) WITH LOCAL TIME ZONE (n≠6) TIMESTAMP(n) WITH LOCAL TIME ZONE -102 (12.1.0.2) Types.OTHER (12.1.0.1以前) 11 n
INTERVAL YEAR TO MONTH INTERVAL YEAR(2) TO MONTH -103 2 0
INTERVAL YEAR(2) TO MONTH INTERVAL YEAR(2) TO MONTH -103 2 0
INTERVAL YEAR(n) TO MONTH (n≠2) INTERVAL YEAR(n) TO MONTH -103 (12.1.0.2) Types.OTHER (12.1.0.1以前) n 0
INTERVAL DAY TO SECOND INTERVAL DAY(2) TO SECOND(6) -104 2 6
INTERVAL DAY(2) TO SECOND(6) INTERVAL DAY(2) TO SECOND(6) -104 2 6
INTERVAL DAY(n) TO SECOND(m) (n≠2 or m≠6) INTERVAL DAY(n) TO SECOND(6) -104 (12.1.0.2) Types.OTHER (12.1.0.1以前) n 6
RAW(2) RAW Types.VARBINARY 2 0
LONG RAW LONG RAW Types.LONGVARBINARY 0 0
BFILE BFILE -13 530 0
BLOB BLOB Types.BLOB 4000 0
CLOB CLOB Types.CLOB 4000 0
NCLOB NCLOB Types.NCLOB (12.1.0.2) Types.OTHER (12.1.0.1以前) 4000 0
ROWID ROWID Types.ROWID (12.1.0.2) Types.OTHER (12.1.0.1以前) 10 0
UROWID UROWID Types.ROWID (12.1.0.2) Types.OTHER (12.1.0.1以前) 4000 0
XMLType XMLTYPE Types.SQLXML (11.2.0.4以降) Types.OTHER (11.1.0.7.0) 2000 0

 

注意点をまとめると、

  • ドライバのバージョンによって微妙にマッピングが違う
  • 12.1.0.1以前では、NCHARやNVARCHAR2やNCLOBがTypes.OTHERにマッピングされる
  • 12.1.0.1以前では、TIMESTAMP(6以外)がTypes.OTHERにマッピングされる
  • BINARY_FLOAT/BINARY_DOUBLEはTypes.FLOAT/Types.DOUBLEにマッピングされない

といったところかな。

 

2015/4/24: TIMESTAMP型のマッピングを修正しました。