H2のデータ型とJavaのデータ型の対応

はじめに

 H2 Database Engine はサポートしているデータ型が多いです。
 多すぎて、Javaのデータ型との対応が覚えられません。
 http://www.h2database.com/html/datatypes.htmlの各データ型の項の「See also」の所を読めば対応は書いてあるのですが、ぱっと見でわかりにくいです。
 というわけで、自分用にチートシートを作りました。

対象

H2 Database Engine 1.0.79 (2008-09-26)

対応表

 各項目の説明は本章の一番下を見てください。

H2のデータ型 See also 備考
INT java.lang.Integer -
BOOLEAN java.lang.Boolean -
TINYINT java.lang.Byte -
SMALLINT java.lang.Short -
BIGINT java.lang.Long -
IDENTITY java.lang.Long -
DECIMAL java.math.BigDecimal -
DOUBLE java.lang.Double -
REAL java.lang.Float -
TIME java.sql.Time java.sql.Timeのインスタンスを生成する際には、年月日の部分は1970年1月1日にしないと挙動不審な動作をします。
DATE java.sql.Date -
TIMESTAMP java.sql.Timestamp -
BINARY - byte[]と互換性があります。SetXXX時には、java.io.InputStream(抽象クラスです)も使用可能です。
OTHER - java.lang.Objectと互換性があります。
VARCHAR java.lang.String SetXXX時には、java.io.Reader(抽象クラスです)も使用可能です。setAsciiStream時には、java.io.InputStream(抽象クラスです)も使用可能です。
VARCHAR_IGNORECASE - java.lang.Stringと互換性があります。
CHAR - java.lang.Stringと互換性があります。
BLOB - ResultSetから取り出す際には、java.sql.Blob(インターフェースです)で取り出します。SetXXX時にはjava.sql.Blob(インターフェースです)、javax.sql.rowset.serial.SerialBlob(J2SE5以降)、byte[]のいずれかを使用します。
CLOB - ResultSetから取り出す際には、java.sql.Clob(インターフェースです)で取り出します。SetXXX時にはjava.sql.Clob(インターフェースです)、javax.sql.rowset.serial.SerialClob(J2SE5以降)、java.lang.Stringのいずれかを使用します。
UUID - java.lang.Longと互換性があります。
ARRAY - java.lang.Objectと互換性があります。紛らわしいですが、java.sql.Arrayとは互換性がありません。
表の項目の説明
H2のデータ型 http://www.h2database.com/html/datatypes.htmlの上部に項目名として取り上げられているものです。
See also 「See also」の項の複写です。対応するJavaのデータ型を表します。プリミティブ型で問題なく使える場面もありますので、その辺は適当に。
備考 備考です。文中のSetXXXはPreparedStatementのSetから始まるメソッドを指しています。具体的なメソッド名は基本的に省略、ということで。私が実験してみた結果とか、ドキュメントから読み取った結果が含まれてますので、参考程度に。私が知らない型変換もあるかもしれません。
その他
  • パラメータをセットする際に、java.sql.CallableStatementで定義されているメソッドを使用してはならない。すべて未実装である。


最後に

 H2 Database Engineのデータ型、Oracleより多いのですね。ユニットテスト用にH2を使用する際には、うっかり本番で使用するDBに無いデータ型を使わないように気をつけたいと思います。