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つをダウンロードして調べてみた。
その結果がこれ。
DBMS型 | TYPE_NAME | DATA_TYPE | COLUMN_SIZE | DECIMAL_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型のマッピングを修正しました。