データ型変換について

Java プログラミング言語のデータ型を SQL Server データ型へ容易に変換できるようにするため、Microsoft SQL Server 2005 JDBC Driver には、JDBC の仕様で必要とされるデータ型変換が用意されています。 さらに高い柔軟性を得るために、すべての型を ObjectString、および byte[] のデータ型との間で変換できるようになりました。

getter メソッドの変換

次の図は、SQL Server 2005 データ型に基づいて、SQLServerResultSet クラスの get<Type> メソッド用の JDBC ドライバの変換マップ、および SQLServerCallableStatement クラスの get<Type> メソッドでサポートされている変換を示しています。

JDBCGetterConversions

JDBC ドライバの getter メソッドでサポートされている変換には、次の 3 つの基本的なカテゴリがあります。

  • データ損失なし (x): getter 型が、基になるサーバーの型と同じか、またはそれより小さい場合の変換です。 たとえば、基になるサーバーの decimal 列で getBigDecimal を呼び出すとき、変換は必要ありません。

  • 変換 (y): サーバーの数値型から Java 言語型への変換です。変換は通常の変換で、Java 言語変換ルールに従って行われます。 これらの変換では、有効桁数は四捨五入されることはなく常に切り捨てられます。オーバーフローは変換後の型の剰余として処理され、変換前より小さくなります。 たとえば、"1.9999" を含む基になる decimal 列で getInt を呼び出すと、"1" が返されます。基になる decimal 値が "3000000000" の場合、int 値はオーバーフローして "-1294967296" となります。

  • データに依存 (z): 基になる文字型から数値型への変換では、文字型は数値型に変換できる値を含んでいる必要があります。 これ以外の変換は行われません。 値が getter 型には大きすぎる場合、その値は有効ではありません。 たとえば、"53" を含む varchar(50) 列で getInt が呼び出された場合、値は int として返されます。基になる値が "xyz" または "3000000000" の場合は、エラーがスローされます。

setter メソッドの変換

SQLServerResultSet クラスの update<Type> メソッドおよび SQLServerPreparedStatement クラスの setObject<Type> メソッドに渡された、Java で型指定されたデータには、次の変換が適用されます。

JDBCSetterConversions

変換後の型が指定されていない setObject メソッドでは、既定のマッピングが使用されます。 パラメータが型指定された setter では、SQLServerPreparedStatement クラスの set<Type> メソッドおよび SQLServerCallableStatement クラスの set<Type> メソッドも、既定の Java 言語から JDBC 型へのマッピングを使用し、その型をサーバーに渡します。 サーバーはすべての変換を試みて、変換に失敗した場合はエラーを返します。

String データ型の場合、値は VARCHAR の長さを超えると LONGVARCHAR にマップされます。 byte[] の場合も同様です。 VARBINARY よりも長い値は、LONGVARBINARY になります。

JDBC ドライバの setter メソッドでサポートされている変換には、次の 2 つの基本的なカテゴリがあります。

  • データ損失なし (x): setter 型が、基になるサーバーの型と同じか、またはそれより小さい場合の数値変換です。 たとえば、基になるサーバーの decimal 列で setBigDecimal を呼び出すとき、変換は必要ありません。 数値を文字に変換する場合、Java の numeric データ型は String に変換されます。 たとえば、varchar(50) 列で "53" の値を使用して setDouble を呼び出すと、変換先の列に文字列値 "53" が作成されます。

  • 変換 (y): Java の numeric 型から基になるサーバーの numeric 型への変換です。これは変換前より小さくなります。 この変換は通常の変換で、SQL Server の変換規則に従って行われます。 有効桁数は常に切り捨てられ、四捨五入されることはありません。オーバーフローするとサポートされていない変換のエラーがスローされます。 たとえば、"1.9999" の値を持つ基になる整数列に updateDecimal を使用すると、変換先の列は "1" になりますが、"3000000000" が渡されるとドライバはエラーをスローします。

SQL Server は一括して設定および更新の変換を行い、問題が発生すると JDBC ドライバにエラーを返します。 クライアント側で行われる変換は例外で、datetimetimestampBoolean、および String の値の場合のみ実行されます。

updateObject および setObject の場合、メソッドは渡されたオブジェクトの型を検索し、適切に型指定された setter メソッドを呼び出します。

参照

その他のリソース

JDBC ドライバのデータ型について