The Scalable Relational Database Server

SQL92が提示している広範囲にわたるデータタイプ・リストのすべてを、FrontBaseではサポートしている。さらに、FrontBaseはSQL3に由来する、数々のデータタイプをもサポートしている。データタイプのリストは、長く、ややもすれば混同しやすいものかもしれないが、心配することはない。名前の多くは、同じデータタイプを意味しているからである(コミッティに由来した作業結果である)。

SQL92 データタイプ: SMALLINT INTEGER INT
DECIMAL NUMERIC FLOAT
REAL DOUBLE PRECISION  
CHARACTER CHAR  
NATIONAL CHARACTER NATIONAL CHAR NCHAR
CHARACTER VARYING CHAR VARYING VARCHAR
NATIONAL CHARACTER VARYING NATIONAL CHAR VARYING NCHAR VARYING
BIT BIT VARYING  
DATE TIME INTERVAL
TIME WITH TIME ZONE TIMESTAMP TIMESTAMP WITH TIME ZONE

SQL3 に由来するデータタイプ BLOB CLOB BOOLEAN

FrontBase 独自のデータタイプ BYTE    


SMALLINT
16ビット整数値としてインプリメントされる。

例:
   CREATE TABLE T0(C0 SMALLINT, ...);


INTEGER, INT
32ビット整数値としてインプリメントされる。わかりきった用途は別として、このデータタイプは、時に、単一列のPRIMARY KEYとして使われることもある。もし、EOFを使っている場合は、EOFの自動生成プライマリ・キーを使って調べてみたいと思うかもしれないし、EOFとしてのBYTEタイプは、データベースへのアクセスなしに、キーを生成することができる。トレードオフは、32ビット整数値のプライマリ・キーが大変シンプルであるのに対し、12バイトのプライマリ・キーというのが、理解しにくいものであるという点であろう。

例:
   CREATE TABLE T0(C0 INTEGER PRIMARY KEY, ...);


DECIMAL[ ( <precision> [ , <scale> ] ) ]
128ビットの整数値と、32ビットの符号を含む指数部としてインプリメントされる。<precision>に対するデフォルトの値は38(すなわち最大値)で、<scale>のデフォルト値は、0である。この表記法は、NSDecimalNumberに独特なものである。指示部を固定したいなら、このデータタイプが適しているだろう。DECIMALの一般的な使い方としては、通貨に関係する値を扱う場合が挙げられる。

FrontBaseでは、基底部に10桁を使うが、これで正確さが損なわれることはない。たとえば、1.23をINSERTした場合、この値は、そのまま取得されストアされたり、返される。1.229994599といった形に変換されることはない。同様のことは、NUMERIC、FLOAT、DOUBLE PRECISION(次節参照)といったデータタイプにもあてはまる。

例:
   CREATE TABLE T0(C0 DECIMAL, PROFITS DECIMAL(20,2), ...);


NUMERIC[ ( <precision> [ , <scale> ] ) ]
64ビット整数値+32ビットの符号を含む指数部としてインプリメントされる。<precision>に対するデフォルトの値は19(すなわち最大値)で、<scale>のデフォルト値は、0である。38桁の正確さを求めるのでなければ、NUMERICをDECIMALの代わりとして用いることができる(これにより、必要となるディスクスペースを減らすことも可能である)。

例:
   CREATE TABLE T0(C0 NUMERIC, SALARY NUMERIC(10,2), ...);


FLOAT[ ( <precision> ) ]
64ビット整数値+32ビットの符号を含む指数部としてインプリメントされる。<precision>のデフォルト値は19(すなわち最大値)である。

例:
   CREATE TABLE T0(C0 FLOAT, C1 FLOAT(10), ...);


REAL
64ビットの整数値+32ビットの符号を含む指数部としてインプリメントされる。<precision>のデフォルト値は19(すなわち最大値)である。REALおよびFLOATは、区別をつけてインプリメントされるが、FLOATを使うときは、例外的に、このREALを、<precision>を最大値にして、指定・使用することも可能である。

例:
   CREATE TABLE T0(C0 REAL, ...);


DOUBLE PRECISION
128ビットの整数値+32ビットの符号をh組む指数部としてインプリメントされる。<precision>のデフォルト値は38(すなわち最大値)である。様々な目的に応じて、このデータタイプをNSDecimalNumber/java.math.BigDecimalにマップするのは、最適の選択だろう。詳細については“Mapping of Foundation/Java objects into FrontBase”を参照のこと。

例:
   CREATE TABLE T0(C0 DOUBLE PRECISION, ...);


CHARACTER, CHAR

昔ながらの、固定長キャラクタ・ストリングとしてインプリメントされる。FrontBaseでは、Unicodeを包括的に扱い、全キャラクタ・ストリングをUTF8エンコーディングとしてストアすることに注意すること。これは、ASCIIよりも、値をもったキャラクタ・ストリングが、同じ文字数でも、より多くのバイト数を占めるということを意味している。非ASCIIキャラクタ、たとえば、 æøåÆØÅといったものは、UTF8フォーマットにエンコードされるとき、2バイトを占有する。

CHARACTER値の最大長は、2GBである。

例:

   CREATE TABLE T0(C0 CHAR(1), C1 CHARACTER(100000), ...);


NATIONAL CHARACTER, NATIONAL CHAR, NCHAR
FrontBaseUnicodeを包括的に扱っているため、NATIONAL CHARACTERデータタイプは、CHARACTERの中に割り当てられる。

例:
   CREATE TABLE T0(C0 NATIONAL CHAR(1), C1 NCHAR(100000), ...);


CHARACTER VARYING, CHAR VARYING, VARCHAR
昔ながらの固定長キャラクタ・ストリングとしてインプリメントされる。可変長ストリングのインプリメンテーションは非常に効果的で、特に大変長いストリングを扱うときも余分な経費がかからない。長さ16バイトまでのストリングは、直接、行レコードにストアされる(固定長ストリングの場合である)。いわゆる、スペル・テーブルは、各テーブルと関連付けられ、テーブル行に挿入される、個々の可変長ストリングはすべて、一度だけストアされる。

FrontBaseは、VARCHARを大変効果的にエンコードするため、固定長ストリングを用いるよりも、可変長ストリングを用いることを一般的には推奨している。

例:
   CREATE TABLE T0(C0 VARCHAR(128), C1 CHARACTER VARYING(200000), ...);


NATIONAL CHARACTER VARYING, NATIONAL CHAR VARYING, NCHAR VARYING
FrontBaseは、Unicodeを包括的にサポートしているので、NATIONAL CHARACTER VARYINGデータタイプは、すべてCHARACTER VARYIGに割り当てられる。

例:
   CREATE TABLE T0(C0 NATIONAL CHAR VARYING(10),
                   C1 NCHAR VARYING(10000), ...);


BIT
BITデータタイプは、概念として、1と0からなるストリングである。しかし、これはバイナリ・データタイプとしては、ややあいまいにインプリメントされる。たとえば、BIT(8)は、1バイトを占める。関係する項目として、以下の、EOFやBYTEの項目も参照すること。

例:
   CREATE TABLE T0(C0 BIT(32), C1 BIT(256)...);


BIT VARYING
BITと基本的に同じであるが、明らかな違いとしては、BITストリングは可変長であるという点が挙げられる。
As BIT, but with the obvious exception that the bit strings are variable in length.

例:
   CREATE TABLE T0(C0 BIT VARYING(32), C1 BIT VARYING(256)...);


BYTE
BITの上位概念。つまり、BYTE(n)は、BIT(n*8)に等しい。このデータタイプは、SQL92標準ではないが、EOFの自動プライマリ・キー生成をサポートしているという点で便利である。12バイトのバイナリ・キーを使う場合、EOFは、データベース・サーバとクライアント間を往復することなしに、自動的にプライマリ・キーを生成する(これにより、初期化されるトランザクションが始まる)。

例:
   CREATE TABLE T0(C0 BYTE(12), ...);


DATE
昔ながらのデータタイプ。DATEは、時刻に関するコンポーネントをまったく含んでいないことに注意すること。DATEの値は、内部的には、(2001-01-01をゼロとして)秒数で表現されており、NUMERIC(0)の値としてストアされている。

例:
   CREATE TABLE T0(C0 DATE, ...);


TIME
タイムスタンプのうち、時刻に関するコンポーネントのみからなる。('12:34:23'のような)TIMEの値は、内部的には、秒数で表現され、UMERIC値としてストアされている。TIMEの値は、負になることもありえることに注意すること。これは、サーバが属するタイムゾーンに関係する。TIMEが挿入されるとき、サーバのタイムゾーンが、timeの値に適用されるからである。

例:
   CREATE TABLE T0(C0 TIME, ...);


TIME WITH TIME ZONE
TIMEと基本的にあ同じであるが、タイムゾーンのオフセットが含めて、timeの値('12:34:23-08:00')をストアする。このデータタイプにより、クライアント側に、正確なタイムゾーンを返すことができる。

例:
   CREATE TABLE T0(C0 TIME WITH TIME ZONE, ...);


TIMESTAMP
日付および時刻といったコンポーネントをすべて含んだ、完全な形のタイムスタンプ情報を保持する。TIMESTAMPの値は、'2001-01-24 12:34:23'のような形式を取り、内部的には、2001-01-01をゼロとして、秒数で表現されるので、NUMERIC値としてストアされる。TIMESTAMPの値は、サーバのタイムゾーンで表現されるものであることに注意すること。すなわち、時刻の値が挿入されるとき、サーバ側タイムゾーンが適用されるのである。これは、TIMESTAMPの値が、クライアント側のタイムゾーンとは異なる可能性があるということだ!

例:
   CREATE TABLE T0(C0 TIMESTAMP, ...);


TIMESTAMP WITH TIME ZONE
TIMESTAMPとの違いは、タイムゾーンのオフセットを含めて、時刻の値をストアする点である。形式としては、'2001-01-24 12:34:23-08:00'のようになる。クライアント側に、性格なタイムゾーンが返される。このデータタイプは、どんなタイムゾーン情報がストアされ、表示されるかを完全に制御したい場合に、必要となるだろう。

例:
   CREATE TABLE T0(C0 TIMESTAMP WITH TIME ZONE, ...);


INTERVAL
INTERVALは、実際には2つのデータタイプに分けられる:1つ目は、いわゆる年−月の間隔で、もう1つは、日付−時刻の間隔である。

年−月の間隔は、内部的には、月数で表現され、32ビットの整数値としてストアされる。

日付−時刻の間隔は、内部的には秒数で表現され、NUMERIC値としてストアされる。

INTERVALの使い道としては、日付とタイムスタンプを操作するときが考えられる。すなわち、日にちあるいは月数を加えるのである::
   DATE '2000-01-25' + INTERVAL '02' MONTH (結果: DATE '2000-03-25' )
      or
   DATE '2000-02-28' + INTERVAL '02' DAY (結果: DATE '2000-03-01' )
例:
   CREATE TABLE T0(C0 INTERVAL YEAR TO MONTH, C1 INTERVAL MONTH, ...);
   CREATE TABLE T1(D0 INTERVAL DAY TO SECOND, C1 INTERVAL HOUR, ...);


BLOB
Binary Large OBjectは、ややあいまいな、バイナリのデータタイプである。ストアしたバイト数は、どんな形に解釈されることはなく、挿入されたときとまったく同じ形で返される。FrontBaseは、サーバがわでストリーミングするなど、BLOBを大変効果的にインプリメントするため、コピーする必要性はまったくない。クライアント側の巣とリーミングは、FrontBase2.0から可能になるよう、計画されている。BLOBの値は、最大で2GBまで取ることができる。

例:
   CREATE TABLE T0(C0 BLOB, ...);


CLOB
Character Large OBjectは、巨大なキャラクタ・ストリング向けのデータタイプである。たとえば、検索したくないようなキャラクタ・ストリングや、通常のCHARACTER/VARCHAR値に対し、効果的に値を増やしていくような場合である(CHARACER/VARCHARの値は、INSERTあるいはUPDATE SQLステートメントに コピーされる)。CLOBは、BLOB同様、非常に効果的にインプリメントされている。CLOBの値は、UTF8フォーマットでエンコードされ、デコードは、クライアント側で実行される。

例:
   CREATE TABLE T0(C0 CLOB, ...);


BOOLEAN
符号なしの1バイトでインプリメントされる。SQL92では、3つの論理的値を使うことに注意すること。すなわち、このデータタイプの値としては、FALSE(0)、TRUE(1)、そしてUNKOWN(255)が可能である。
例:
   CREATE TABLE T0(C0 BOOLEAN, ...);

(c)Copyright 1999-2006 A10 all right reserved.