すべての DBMS では、情報をテーブルのフィールドに保存する際に データ型を選択できるようになっています。しかし、選択できるデータ型は DBMS の種類によってまちまちです。
MDB2 がサポートする DBMS とのインターフェイスを簡潔にするため、DBMS の種類を問わずにアプリケーションからアクセスできる基本的なデータ型が定義されています。
MDB2 API は、 選択したデータベースに応じてデータ型の変換を行います。 個々の DBMS に対応するドライバを使用して、送受信するデータの型の自動変換を行います。
以下のデータ型の例は、MDB2 の createTable() メソッドで用いられます。データ型の節の最後にある配列を使用して createTable() は選択した DBMS 上に可搬性の高い表を作成します (実際にどのような DBMS がサポートされているのかについては MDB2 のメインドキュメントを参照ください)。 以下の例は、インデックスの作成や保守については網羅していないことに注意しましょう。 この章で扱うのは、データ型とその適切な使用法だけです。
MDB2 API で、テーブル設計のために使用される修飾子は次のとおりです。
notnull 修飾子
length 修飾子
default 修飾子
フィールド定義によっては unsigned 修飾子も使用しますが、 すべての DBMS が整数フィールドでこれをサポートしているわけではありません。
フィールド定義によっては fixed 修飾子も使用します。
'sometime' = array( 'type' = 'time', 'default' = '12:34:05', 'notnull' = true, ), |
例 39-1length 修飾子の例
|
上の例は、可変長文字列で長さ 12 文字のフィールドをデータベース上のテーブルに作成します。 length を定義しなければ、MDB2 はデータ型が許す限りの最大長で作成します。 これは、フィールドの型によっては問題となるでしょうし、 インデックスを作成する際にも問題となります。 出来る限り、length を指定しておくようにしましょう。
text 型には二通りの選択肢があります。ひとつは明示的に文字数を指定するもの、 そしてもうひとつは文字数を制限しないものです。制限しない場合は、 データベースが許す限りの文字を格納することができます。
効率を考えると、通常は文字数を制限する方式のほうがお勧めです。 定義しない方式では大きな値を扱うことができますが、 インデックスが使用できなくなります。 また、null を代入したりこのフィールドでのソートをしたりもできなくなります。
この型のフィールドは 8 ビット文字を扱うことができます。 文字列をこの型に変換する際に、ドライバが DBMS 固有の特殊文字のエスケープ処理を行います。
デフォルトでは、MDB2 は可変長文字型を使用します。 固定長を使用したい場合は、fixed 修飾子を使用します。
例 39-2 length および fixed を指定した text 型の例
|
boolean 型は、1 か 0 のいずれかのみの値を表します。 これらのデータが整数として保存されるとは限りません。DBMS ドライバによっては、効率を考慮してこれを一文字のテキストフィールドで扱うかもしれません。 null を使用して、三択形式を扱うこともできます。 この型のフィールドには null を代入することができます。
例 39-3Boolean 型の例
|
integer 型は、各 DBMS が処理できる範囲の整数値を保存します。 この型はオプションで符号なしとすることもできますが、 すべての DBMS がそれをサポートしているわけではありません。 そのような場合、オプションを指定しても無視されます。 真に可搬性のあるアプリケーションを作成するなら、 このオプションの機能に頼ってはいけません。
例 39-4Integer 型の例
|
decimal 型は、十進数を正確に固定桁数で保存します。 このデータ型は、金額のような正確な値を表す際に便利です。
DBMS ドライバによっては、整数型を使用して十進データをエミュレートしているものもあります。 そのようなドライバでは、データベースとの値のやり取りの際に、 桁数を事前に知っておく必要があります。 しかし、アプリケーション側では decimail 型のフィールドの値を用いて 算術演算や関数の使用が可能です。式の中で使用される値は、 対応する MDB2 の変換関数で変換されます。
小数点の左側と右側で使用できる桁数は、それぞれ事前に定義されている固定値です。 データベースに格納されているすべての値で同じになります。デフォルトでは、 MDB2 は小数部の桁数を 2 としています。しかしこれは、 データベースへの接続時に変更することができます。 小数部に使用できる桁数の制限は、DBMS によって異なります。
データベースをインストールした後で、decimail 型の桁数を変更することはお勧めしません。MDB2 は、 桁数が変更されたことを知ることができません。桁数を指定するには setOption() メソッドを使用します。
例 39-5Decimal 型の例
|
float 型は、浮動小数点数を格納します。 これは、大きな数値で高精度を必要としないデータに適しています。 桁数と精度の制限は、使用している DBMS に依存します。
例 39-6Float 型の例
|
date 型は年月日を表します。DBMS に依存しない日付表現形式として、 IS0-8601 形式の文字列を使用します。
ISO-8601 では、日付は YYYY-MM-DD と定義されています。YYYY は年 (グレゴリオ暦)、MM は月 (01 から 12)、 そして DD は日 (01 から 31) となります。 一桁の月や日は、先頭にゼロが付加されます。
DBMS によっては日付型をネイティブでサポートしているものもあります。 しかし、日付を整数値やテキストで表す DBMS もあります。 いずれの場合でも、日付データの比較や日付型のフィールドによるソートが可能です。
例 39-7Date 型の例
|
time 型は、ある日の指定した時刻を表します。 DBMS に依存しない時刻表現形式として、 IS0-8601 形式の文字列を使用します。
ISO-8601 では、時刻は HH:MI:SS と定義されています。HH は時 (00 から 23)、MI と SS はそれぞれ分と秒 (00 から 59) となります。 一桁の時、分、秒は、先頭にゼロが付加されます。
DBMS によっては時刻型をネイティブでサポートしているものもあります。 しかし、時刻を整数値やテキストで表す DBMS もあります。 いずれの場合でも、時刻データの比較や時刻型のフィールドによるソートが可能です。
例 39-8Time 型の例
|
タイムスタンプ型は、単に date 型と time 型をまとめただけのものです。 タイムスタンプ型の値の表示方法は、日付と時刻を文字列で表して それをスペース区切りで連結します。つまり、 YYYY-MM-DD HH:MI:SS のような書式になります。 この値は、date 型および time 型で説明したのと同じ制限事項に従います。
例 39-9Timestamp 型の例
|
ラージオブジェクトデータ型は、不定長のデータで text フィールドに保存するには大きすぎるであろうものを格納するためのものです。 たとえば、通常はファイルに保存しているようなデータなどです。
MDB2 は二種類のラージオブジェクトフィールドをサポートしています。 Character Large OBjects (CLOBs) と Binary Large OBjects (BLOBs) です。CLOB フィールドは、表示可能な ASCII 文字のみからなるデータを保存するためのフィールドです。 BLOB フィールドはあらゆる形式のデータを格納できます。
ラージオブジェクト型のフィールドは、通常はクエリの検索条件 (WHERE) で使用することはありません。 しかし、DBMS によってはいわゆる "全文検索" をサポートしていることもあります。
例 39-10ラージオブジェクト型の例
|
例 39-11フィールド定義の例
|
上の例は、次のようなテーブルを作成します。
表 39-1PostgreSQL
カラム | 型 | Not Null | デフォルト | コメント |
---|---|---|---|---|
id | character(32) | |||
somename | character varying(12) | |||
somedate | date | |||
sometimestamp | timestamp without time zone | |||
someboolean | boolean | |||
somedecimal | numeric(18,2) | |||
somefloat | double precision | |||
sometime | time without time zone | NOT NULL | '12:34:05'::time without time zone | |
someclob | text | |||
someblob | bytea |
表 39-2MySQL
フィールド | 型 | Collation | 属性 | Null | デフォルト | コメント |
---|---|---|---|---|---|---|
id | char(32) | YES | ||||
somename | varchar(12) | latin1_swedish_ci | YES | |||
somedate | date | YES | ||||
sometimestamp | timestamp without time zone | YES | ||||
someboolean | tinyint(1) | YES | ||||
somedecimal | decimal(18,2) | YES | ||||
somefloat | double | YES | ||||
sometime | time | NO | 12:34:05 | |||
someclob | longtext | latin1_swedish_ci | YES | |||
someblob | longblob | binary | YES |
独自のデータ型を定義することもできます。 これについてもそのうちに紹介します。今のところは、blog のこれらの投稿を参照ください。
さらなる情報は getTypeDeclaration や getDeclaration を参照ください。