目次 | 前の項目 | 次の項目 JDBCTM ガイド: 入門


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 のデータ型への逆方向のマッピングです。 普通、String は VARCHAR にマッピングされますが、ドライバが対応する VARCHAR の値の範囲を超える値の場合は、LONGVARCHAR にマッピングされます。byte[] から VARBINARY と LONGVARBINARY へのマッピングについても同様です。

表 3: Java のデータ型から SQL のデータ型への標準的なマッピング

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 種類が定義されています。

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.