8 SQL のデータ型と Java のマッピング
8.1 制限事項
Java と SQL の一般的なデータ型との間に適切なマッピングを設定する必要があります。また、パラメータの設定や取得および SQL 文からの結果の復元を正しく行うのに十分な型情報があることを、確認する必要があります。
ただし、Java のデータ型と SQL のデータが完全に同型である必要はありません。たとえば、Java には固定長の配列がないため、SQL の固定長と可変長の配列の両方を Java では可変長配列として表します。また、SQL の CHAR 系データ型には Java の String を使いますが、String は CHAR 系データ型のどれとも厳密には一致しません。
表 2 は、Java のデータ型と SQL の一般的なデータ型のデフォルトのマッピングです。データベースの中には、これらのデータ型の一部だけをサポートしているものもあります。さまざまなマッピングの詳細については、あとの項で説明します。
表 2: SQL のデータ型から Java のデータ型への標準的なマッピング
SQL のデータ型
| Java のデータ型
|
---|
CHAR
| String
|
VARCHAR
| String
|
LONGVARCHAR
| String
|
NUMERIC
| java.math.BigDecimal
|
DECIMAL
| java.math.BigDecimal
|
BIT
| boolean
|
TINYINT
| byte
|
SMALLINT
| short
|
INTEGER
| int
|
BIGINT
| long
|
REAL
| float
|
FLOAT
| double
|
DOUBLE
| double
|
BINARY
| byte[]
|
VARBINARY
| byte[]
|
LONGVARBINARY
| byte[]
|
DATE
| java.sql.Date
|
TIME
| java.sql.Time
|
TIMESTAMP
| java.sql.Timestamp
|
表 3 は、Java のデータ型から SQL のデータ型への逆方向のマッピングです。
表 3: Java のデータ型から SQL のデータ型への標準的なマッピング
普通、String は VARCHAR にマッピングされますが、ドライバが対応する VARCHAR の値の範囲を超える値の場合は、LONGVARCHAR にマッピングされます。byte[] から VARBINARY と LONGVARBINARY へのマッピングについても同様です。
Java のデータ型
| SQL のデータ型
|
---|
String
| VARCHAR または LONGVARCHAR
|
java.math.BigDecimal
| NUMERIC
|
boolean
| BIT
|
byte
| TINYINT
|
short
| SMALLINT
|
int
| INTEGER
|
long
| BIGINT
|
float
| REAL
|
double
| DOUBLE
|
byte[]
| VARBINARY または LONGVARBINARY
|
java.sql.Date
| DATE
|
java.sql.Time
| TIME
|
java.sql.Timestamp
| TIMESTAMP
|
8.2 ダイナミックデータアクセス
この章では、コンパイル時にデータ型がわかる結果やパラメータへのアクセスについて説明しています。しかし、一般的なブラウザやクエリーツールなど一部のアプリケーションでは、アクセスするデータベースの形式がコンパイル時にはわからないので、JDBC では、完全に動的なアクセス方法もサポートされています。詳細については、14.2 項を参照してください。
8.3 CHAR、VARCHAR、および LONGVARCHAR
Java のプログラムでは、SQL で使われている 3 種類の文字列データ型 CHAR、VARCHAR、および LONGVARCHAR を区別する必要はありません。Java では、これらのデータ型をすべて同じものとして表現できます。SQL で想定されているデータの型を厳密に知らなくても、SQL の読み書きを正確に行うことができます。
これらの型は、String または char[] のどちらにでもマッピングできます。慎重に検討した結果、一般的な使用に適しているとの判断から、String を使うことに決まりました。なお、Java の String クラスには、String を char[] に変換するメソッドと、char[] を String に変換するためのコンストラクタが用意されています。
SQL の固定長文字列型 CHAR(n) に対して、JDBC ドライバは必要に応じてスペースのパディングを行います。したがって、データベースから CHAR(n) 型のフィールドを取得した場合、結果の String 型は長さが必ず n になり、最後にスペースがいくつかパディングされている可能性があります。String 型のデータを CHAR(n) フィールドに送る場合は、ドライバまたはデータベース、あるいはその両方で String の末尾に必要な数のスペースがパディングされて、長さが n になるように調整されます。
ResultSet.getString メソッドは、新しい String オブジェクトを割り当てて返します。この方法は普通のデータを取り出すには適していますが、SQL の LONGVARCHAR 型には何メガバイトものデータが格納されている場合があります。したがって、LONGVARCHAR の値をチャンクとして取り出す方法が必要になります。このような場合は、Java の入力ストリームとして LONGVARCHAR のデータを取り出します。この方法を使うと、扱いやすいサイズのチャンクに分けて連続してデータを読み取ることができます。Java のストリームは Unicode と ASCII のどちらのデータにも使えるので、メソッドも getAsciiStream と getUnicodeStream の 2 種類が用意されています。
8.4 DECIMAL と NUMERIC
SQL のデータ型 DECIMAL と NUMERIC は、絶対精度が求められる固定小数点数に使われます。通貨の値によく使われます。
この 2 つのデータ型は、Java では同じものとして表されます。もっとも妥当なマッピングは、JDK 1.1 の拡張精度数値型 java.math.BigDecimal を使うものです。
また、単純な String および char の配列として DECIMAL と NUMERIC にアクセスすることもできます。つまり、getString メソッドを使って、NUMERIC または DECIMAL の結果を受け取ることができます。
8.5 BINARY、VARBINARY、および LONGVARBINARY
Java のプログラムでは、SQL で使われている 3 種類のバイト配列 BINARY、VARBINARY、および LONGVARBINARY を区別する必要はありません。Java では、これらのデータ型はすべて同じバイト配列として表現できます。SQL で想定されている BINARY 系データの型を厳密に知らなくても、SQL の読み書きを正確に行うことができます。
SQL の LONGVARCHAR 型と同じように、SQL の LONGVARBINARY 型を使って何メガバイトにもなるデータ値が返される場合があります。そのため、Java の入力ストリームとして LONGVARBINARY 型の値を取得できるようになっており、扱いやすいサイズのチャンクに分けて連続してデータを読み取ることができます。
8.6 BIT
SQL の BIT 型は、Java の boolean 型に直接マッピングできます。
8.7 TINYINT、SMALLINT、INTEGER、および BIGINT
SQL のデータ型 TINYINT、SMALLINT、INTEGER、および BIGINT は、それぞれ 8 ビット、16 ビット、32 ビット、および 64 ビットの値を表します。したがって、これらは、Java のデータ型 byte、short、int、および long にマッピングできます。
8.8 REAL、FLOAT、および DOUBLE
SQL では、浮動小数点数のデータ型として、REAL、FLOAT、および DOUBLE が定義されています。
REAL は Java の float に、また FLOAT と DOUBLE は Java の double にそれぞれマッピングされます。
REAL の場合、7 桁の仮数部精度をサポートする必要があります。FLOAT と DOUBLE の場合は、仮数部の精度として 15 桁が必要です。
8.9 DATE、TIME、および TIMESTAMP
SQL では、日時に関して 3 種類のデータ型が定義されています。DATE は年月日で、TIME は時分秒で、それぞれ構成されています。また、TIMESTAMP は、DATE と TIME を組み合わせたものにさらにナノ秒が追加されています。
日付と時刻の情報を提供する Java の標準クラスとして java.util.Date があります。ただし、このクラスは SQL の 3 種類のデータ型のどれとも完全には一致しません。DATE と TIME に対応する情報は含まれていますが、TIMESTAMP で必要なナノ秒の単位が含まれていません。
したがって、java.util.Date のサブクラスとして次の 3 種類が定義されています。
- SQL の DATE 型に対応する java.sql.Date
- SQL の TIME 型に対応する java.sql.Time
- SQL の TIMESTAMP 型に対応する java.sql.Timestamp
java.sql.Date クラスの場合、java.util.Date 基底クラスの時、分、秒、およびミリ秒のフィールドには 0 が設定されます。
java.sql.Time クラスの場合、java.util.Date 基底クラスの年、月、日のフィールドには、1970 年 1 月 1 日が設定されます。Java の暦ではこれが「ゼロ」日になります。
java.sql.Timestamp クラスは、java.util.Date クラスにナノ秒のフィールドを追加して拡張したものです。
目次 | 前の項目 | 次の項目
jdbc@wombat.eng.sun.com
または
jdbc-odbc@wombat.eng.sun.com
Copyright © 1996, 1997 Sun Microsystems, Inc. All rights reserved.