7.6.1 データ型のマッピング
ここでは,HADBのデータ型とJDBCのSQLデータ型のマッピングについて説明します。
(1) HADBのデータ型とJDBCのSQLデータ型の対応
HADBのデータ型とJDBCのSQLデータ型は,完全には一致していません。そのため,JDBCドライバが,HADBのデータ型とJDBCのSQLデータ型をマッピング(変換)します。マッピングできないデータ型を使用してアクセスしようとすると,SQLExceptionが投入されます。
データ型のマッピングは,ResultSetまたはPreparedStatementクラスのgetXXXメソッドおよびsetXXXメソッドで実行します。getXXXメソッドおよびsetXXXメソッドのマッピング規則については,JDBC1.0規格またはJDBC 2.0基本規格のドキュメントを参照してください。
HADBのデータ型とJDBCのSQLデータ型の対応を次の表に示します。
|
HADBのデータ型 |
JDBCのSQLデータ型 |
|---|---|
|
INTEGER |
BIGINT |
|
SMALLINT |
INTEGER,SMALLINT※1 |
|
DECIMAL,NUMERIC |
DECIMAL(,NUMERIC)※2 |
|
DOUBLE PRECISION,FLOAT |
DOUBLE(,FLOAT)※2 |
|
CHAR |
CHAR |
|
VARCHAR |
VARCHAR(,LONGVARCHAR)※2 |
|
DATE |
DATE |
|
TIME |
TIME |
|
TIMESTAMP |
TIMESTAMP |
|
BINARY |
BINARY(,VARBINARY,LONGVARBINARY)※2 |
|
VARBINARY |
VARBINARY(,BINARY,LONGVARBINARY)※2 |
|
ROW |
BINARY(,VARBINARY,LONGVARBINARY)※2 |
|
BOOLEAN※3 |
BOOLEAN |
|
ARRAY |
ARRAY |
- 注※1
-
DatabaseMetaDataから生成したResultSetにだけ存在する列です。データ型がshortで規定されている列の場合,ResultSetMetaDataで取得できるメタデータにはSMALLINTに対応した値を返却します。ただし,メタデータ以外はINTEGERに対応した値を返却します。
- 注※2
-
( )内のデータ型は,setNullメソッドまたはsetObjectメソッドの引数にJDBCのSQLデータ型を指定する場合にだけ対応します。HADBのデータ型からJDBCのSQLデータ型へマッピングする際には対応しません。
- 注※3
-
DatabaseMetaDataのgetTypeInfoメソッドなどで生成される,ResultSetオブジェクトが持つBOOLEAN型の列を指します。
(2) 検索データ取得時のマッピング
ResultSetクラスのgetXXXメソッドと,JDBCのSQLデータ型とのマッピングを次の表に示します。マッピングできないJDBCのSQLデータ型に対してgetXXXメソッドが呼び出された場合は,SQLExceptionが投入されます。
|
メソッド名 |
JDBCのSQLデータ型 |
||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
|
BIGINT |
INTEGER |
DECIMAL |
DOUBLE |
CHAR |
VARCHAR |
DATE |
TIME |
TIMESTAMP |
BINARY, VARBINARY |
ARRAY |
|
|
getByte |
○ |
○ |
○ |
○ |
○※ |
○※ |
× |
× |
× |
× |
× |
|
getShort |
○ |
○ |
○ |
○ |
○※ |
○※ |
× |
× |
× |
× |
× |
|
getInt |
○ |
◎ |
○ |
○ |
○※ |
○※ |
× |
× |
× |
× |
× |
|
getLong |
◎ |
○ |
○ |
○ |
○※ |
○※ |
× |
× |
× |
× |
× |
|
getFloat |
○ |
○ |
○ |
○ |
○※ |
○※ |
× |
× |
× |
× |
× |
|
getDouble |
○ |
○ |
○ |
◎ |
○※ |
○※ |
× |
× |
× |
× |
× |
|
getBigDecimal |
○ |
○ |
◎ |
○ |
○※ |
○※ |
× |
× |
× |
× |
× |
|
getBoolean |
○ |
○ |
○ |
○ |
○ |
○ |
× |
× |
× |
× |
× |
|
getString |
○ |
○ |
○ |
○ |
◎ |
◎ |
○ |
○ |
○ |
○ |
× |
|
getBytes |
× |
× |
× |
× |
× |
× |
× |
× |
× |
◎ |
× |
|
getDate |
× |
× |
× |
× |
○※ |
○※ |
◎ |
○ |
○ |
× |
× |
|
getTime |
× |
× |
× |
× |
○※ |
○※ |
× |
◎ |
○ |
× |
× |
|
getTimestamp |
× |
× |
× |
× |
○※ |
○※ |
○ |
○ |
◎ |
× |
× |
|
getAsciiStream |
× |
× |
× |
× |
○ |
○ |
× |
× |
× |
○ |
× |
|
getObject |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
|
getCharacterStream |
× |
× |
× |
× |
○ |
○ |
× |
× |
× |
○ |
× |
|
getBinaryStream |
× |
× |
× |
× |
× |
× |
× |
× |
× |
○ |
× |
|
getArray |
× |
× |
× |
× |
× |
× |
× |
× |
× |
× |
◎ |
- (凡例)
-
◎:マッピングすることを推奨します。
○:マッピングできます。ただし,変換元のデータ形式によっては,データの欠落や変換エラーになることがあるため,注意してください。
×:マッピングできません。
- 注※
-
このメソッドでの変換の際に,データベースから取得した文字列データの前後に半角空白がある場合は,半角空白を取り除きます。また,半角空白を取り除いたあと,getXXXメソッドが返却するJavaのデータ型に変換します。
Javaのデータ型に変換する場合の注意事項を次に示します。
-
文字列データに小数点以下の表現がある場合,getByteメソッド,getIntメソッド,getShortメソッド,またはgetLongメソッドを実行すると,小数点以下を切り捨てて整数だけを変換し,返却します。
-
文字列データに全角文字が含まれている場合,変換はしないでSQLExceptionが投入されます。
-
文字列データをJavaのデータ型に変換した結果,オーバフローが発生した場合,SQLExceptionが投入されます。
-
(3) ?パラメタ設定時のマッピング
PreparedStatementクラスのsetXXXメソッドと,マッピングされるJDBCのSQLデータ型を次の表に示します。使用できないJDBCのSQLデータ型の場合,SQLExceptionが投入されます。
PreparedStatementクラスのsetXXXメソッドと各JDBCのSQLデータ型とのマッピングを次の表に示します。
|
メソッド名 |
JDBCのSQLデータ型 |
||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
|
BIGINT |
INTEGER |
DECIMAL※1 |
DOUBLE |
CHAR |
VARCHAR |
DATE |
TIME |
TIMESTAMP |
BINARY, VARBINARY |
ARRAY |
|
|
setByte |
○ |
○ |
○ |
○ |
○ |
○ |
× |
× |
× |
× |
× |
|
setShort |
○ |
○ |
○ |
○ |
○ |
○ |
× |
× |
× |
× |
× |
|
setInt |
○ |
◎ |
○ |
○ |
○ |
○ |
× |
× |
× |
× |
× |
|
setLong |
◎ |
○ |
○ |
○ |
○ |
○ |
× |
× |
× |
× |
× |
|
setFloat |
○ |
○ |
○ |
○ |
○ |
○ |
× |
× |
× |
× |
× |
|
setDouble |
○ |
○ |
○ |
◎ |
○ |
○ |
× |
× |
× |
× |
× |
|
setBigDecimal |
○ |
○ |
◎ |
○ |
○ |
○ |
× |
× |
× |
× |
× |
|
setBoolean |
○ |
○ |
○ |
○ |
○ |
○ |
× |
× |
× |
× |
× |
|
setString |
○ |
○ |
○ |
○ |
◎ |
◎ |
○ |
○ |
○ |
○ |
× |
|
setBytes |
× |
× |
× |
× |
× |
× |
× |
× |
× |
◎ |
× |
|
setDate |
× |
× |
× |
× |
○ |
○ |
◎ |
○ |
○ |
× |
× |
|
setTime |
× |
× |
× |
× |
○ |
○ |
× |
◎ |
○ |
× |
× |
|
setTimestamp※2 |
× |
× |
× |
× |
○ |
○ |
○ |
○ |
◎ |
× |
× |
|
setAsciiStream |
× |
× |
× |
× |
○ |
○ |
× |
× |
× |
○ |
× |
|
setObject※3 |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
× |
|
setCharacterStream |
× |
× |
× |
× |
○※4 |
○※4 |
× |
× |
× |
○ |
× |
|
setBinaryStream |
× |
× |
× |
× |
× |
× |
× |
× |
× |
○ |
× |
- (凡例)
-
◎:マッピングすることを推奨します。
○:マッピングできます。ただし,変換元データの形式によっては,データの欠落や変換エラーとなることがあるため,注意してください。
×:マッピングできません。
- 注※1
-
HADBのデータ型であるDECIMAL型またはNUMERIC型の?パラメタに対してsetXXXメソッドで値を指定する場合に,?パラメタの精度および位取りと,値の精度および位取りが一致していないときの動作を次に示します。
-
?パラメタの精度よりも大きいとき:SQLExceptionが投入されます。
-
?パラメタの精度よりも小さいとき:拡張します。
-
?パラメタの位取りよりも大きいとき:実際の位取りで切り捨てます。
-
?パラメタの位取りよりも小さいとき:0で補完して,拡張します。
-
- 注※2
-
HADBのデータ型であるTIME型またはTIMESTAMP型の?パラメタに対してsetXXXメソッドで値を指定する場合に,?パラメタの小数秒精度と値の小数秒精度が一致していないときの動作を次に示します。
-
?パラメタの小数秒精度よりも大きいとき:切り捨てます。
-
?パラメタの小数秒精度よりも小さいとき:拡張します。
-
- 注※3
-
setObjectメソッドにInputStreamクラスおよびReaderクラス(サブクラスを含む)のオブジェクトは指定できません。
- 注※4
-
java.io.Readerオブジェクトから取得できるデータの長さが,引数で指定した長さより短い場合,次に示すように引数で指定した長さまで0を補完します。