データ型

データ型 -- データ型の処理の概要

導入

すべての DBMS では、情報をテーブルのフィールドに保存する際に データ型を選択できるようになっています。しかし、選択できるデータ型は DBMS の種類によってまちまちです。

MDB2 がサポートする DBMS とのインターフェイスを簡潔にするため、DBMS の種類を問わずにアプリケーションからアクセスできる基本的なデータ型が定義されています。

MDB2 API は、 選択したデータベースに応じてデータ型の変換を行います。 個々の DBMS に対応するドライバを使用して、送受信するデータの型の自動変換を行います。

以下のデータ型の例は、MDB2 の createTable() メソッドで用いられます。データ型の節の最後にある配列を使用して createTable() は選択した DBMS 上に可搬性の高い表を作成します (実際にどのような DBMS がサポートされているのかについては MDB2 のメインドキュメントを参照ください)。 以下の例は、インデックスの作成や保守については網羅していないことに注意しましょう。 この章で扱うのは、データ型とその適切な使用法だけです。

"グローバルな" テーブル型修飾子

MDB2 API で、テーブル設計のために使用される修飾子は次のとおりです。

これらの修飾子を使用してフィールド定義を変更し、 それぞれの場面により適したフィールドを作成します。 notnull 修飾子を次のように使用すると、 そのフィールドに対して DBMS の NOT NULL フラグを true あるいは false に設定します。これは、フィールドの DBMS 上での定義に依存します。PostgreSQL では "NOT NULL" の定義は "NOT NULL" となります。一方 (たとえば) MySQL では "NULL" オプションを "NO" に設定します。 フィールド型 "NOT NULL" を定義するためには、定義配列 (次の節の例を参照ください) に追加のパラメータを指定するだけです。
'sometime' = array(
    'type'    = 'time',
    'default' = '12:34:05',
    'notnull' = true,
),
上の例から、default についても確認しておきましょう。 default は notnull 演算子と同じように働き、 フィールドのデフォルト値を設定します。この値は、 text フィールドでは DBMS がサポートする任意の文字列を指定でき、 その他のデータ型のフィールドでも、その型で有効な値なら何でも指定できます。 上の例では、データ型 "Time" として有効な値である '12:34:05' を指定しています。 デフォルトの日付および時刻、あるいはタイムスタンプを設定する際には、 使用している DBMS でサポートしている範囲を確認しておくようにしましょう。 さもないと、原因をつかみにくい問題が発生してしまいます。

上の例は、可変長文字列で長さ 12 文字のフィールドをデータベース上のテーブルに作成します。 length を定義しなければ、MDB2 はデータ型が許す限りの最大長で作成します。 これは、フィールドの型によっては問題となるでしょうし、 インデックスを作成する際にも問題となります。 出来る限り、length を指定しておくようにしましょう。

Text 型

text 型には二通りの選択肢があります。ひとつは明示的に文字数を指定するもの、 そしてもうひとつは文字数を制限しないものです。制限しない場合は、 データベースが許す限りの文字を格納することができます。

効率を考えると、通常は文字数を制限する方式のほうがお勧めです。 定義しない方式では大きな値を扱うことができますが、 インデックスが使用できなくなります。 また、null を代入したりこのフィールドでのソートをしたりもできなくなります。

この型のフィールドは 8 ビット文字を扱うことができます。 文字列をこの型に変換する際に、ドライバが DBMS 固有の特殊文字のエスケープ処理を行います。

デフォルトでは、MDB2 は可変長文字型を使用します。 固定長を使用したい場合は、fixed 修飾子を使用します。

Boolean 型

boolean 型は、1 か 0 のいずれかのみの値を表します。 これらのデータが整数として保存されるとは限りません。DBMS ドライバによっては、効率を考慮してこれを一文字のテキストフィールドで扱うかもしれません。 null を使用して、三択形式を扱うこともできます。 この型のフィールドには null を代入することができます。

Integer 型

integer 型は、各 DBMS が処理できる範囲の整数値を保存します。 この型はオプションで符号なしとすることもできますが、 すべての DBMS がそれをサポートしているわけではありません。 そのような場合、オプションを指定しても無視されます。 真に可搬性のあるアプリケーションを作成するなら、 このオプションの機能に頼ってはいけません。

Decimal 型

decimal 型は、十進数を正確に固定桁数で保存します。 このデータ型は、金額のような正確な値を表す際に便利です。

DBMS ドライバによっては、整数型を使用して十進データをエミュレートしているものもあります。 そのようなドライバでは、データベースとの値のやり取りの際に、 桁数を事前に知っておく必要があります。 しかし、アプリケーション側では decimail 型のフィールドの値を用いて 算術演算や関数の使用が可能です。式の中で使用される値は、 対応する MDB2 の変換関数で変換されます。

小数点の左側と右側で使用できる桁数は、それぞれ事前に定義されている固定値です。 データベースに格納されているすべての値で同じになります。デフォルトでは、 MDB2 は小数部の桁数を 2 としています。しかしこれは、 データベースへの接続時に変更することができます。 小数部に使用できる桁数の制限は、DBMS によって異なります。

データベースをインストールした後で、decimail 型の桁数を変更することはお勧めしません。MDB2 は、 桁数が変更されたことを知ることができません。桁数を指定するには setOption() メソッドを使用します。

Float 型

float 型は、浮動小数点数を格納します。 これは、大きな数値で高精度を必要としないデータに適しています。 桁数と精度の制限は、使用している DBMS に依存します。

Date 型

date 型は年月日を表します。DBMS に依存しない日付表現形式として、 IS0-8601 形式の文字列を使用します。

ISO-8601 では、日付は YYYY-MM-DD と定義されています。YYYY は年 (グレゴリオ暦)、MM は月 (01 から 12)、 そして DD は日 (01 から 31) となります。 一桁の月や日は、先頭にゼロが付加されます。

DBMS によっては日付型をネイティブでサポートしているものもあります。 しかし、日付を整数値やテキストで表す DBMS もあります。 いずれの場合でも、日付データの比較や日付型のフィールドによるソートが可能です。

Time 型

time 型は、ある日の指定した時刻を表します。 DBMS に依存しない時刻表現形式として、 IS0-8601 形式の文字列を使用します。

ISO-8601 では、時刻は HH:MI:SS と定義されています。HH は時 (00 から 23)、MISS はそれぞれ分と秒 (00 から 59) となります。 一桁の時、分、秒は、先頭にゼロが付加されます。

DBMS によっては時刻型をネイティブでサポートしているものもあります。 しかし、時刻を整数値やテキストで表す DBMS もあります。 いずれの場合でも、時刻データの比較や時刻型のフィールドによるソートが可能です。

Timestamp 型

タイムスタンプ型は、単に date 型と time 型をまとめただけのものです。 タイムスタンプ型の値の表示方法は、日付と時刻を文字列で表して それをスペース区切りで連結します。つまり、 YYYY-MM-DD HH:MI:SS のような書式になります。 この値は、date 型および time 型で説明したのと同じ制限事項に従います。

ラージオブジェクト (ファイル) 型

ラージオブジェクトデータ型は、不定長のデータで text フィールドに保存するには大きすぎるであろうものを格納するためのものです。 たとえば、通常はファイルに保存しているようなデータなどです。

MDB2 は二種類のラージオブジェクトフィールドをサポートしています。 Character Large OBjects (CLOBs) と Binary Large OBjects (BLOBs) です。CLOB フィールドは、表示可能な ASCII 文字のみからなるデータを保存するためのフィールドです。 BLOB フィールドはあらゆる形式のデータを格納できます。

ラージオブジェクト型のフィールドは、通常はクエリの検索条件 (WHERE) で使用することはありません。 しかし、DBMS によってはいわゆる "全文検索" をサポートしていることもあります。

すべてをひとまとめにする

上の例は、次のようなテーブルを作成します。

表 39-1PostgreSQL

カラムNot Nullデフォルトコメント
idcharacter(32)   
somenamecharacter varying(12)   
somedatedate   
sometimestamptimestamp without time zone   
somebooleanboolean   
somedecimalnumeric(18,2)   
somefloatdouble precision   
sometimetime without time zoneNOT NULL'12:34:05'::time without time zone 
someclobtext   
someblobbytea   

表 39-2MySQL

フィールドCollation属性Nullデフォルトコメント
idchar(32)  YES  
somenamevarchar(12)latin1_swedish_ci YES  
somedatedate  YES  
sometimestamptimestamp without time zone  YES  
somebooleantinyint(1)  YES  
somedecimaldecimal(18,2)  YES  
somefloatdouble  YES  
sometimetime  NO12:34:05 
somecloblongtextlatin1_swedish_ci YES  
somebloblongblob binaryYES  

独自のデータ型やさらなる情報

独自のデータ型を定義することもできます。 これについてもそのうちに紹介します。今のところは、blog のこれらの投稿を参照ください。

さらなる情報は getTypeDeclarationgetDeclaration を参照ください。