# CHAPTER 3: データタイプ

## 3.1 はじめに

Empressでは、全てのフィールドがデータを保持するために特定の データタイプを宣言します。それらは以下のとおりです。

Table 3-1: Empressデータタイプ

タイプ | 宣言
Character | `CHAR`あるいは`CHARACTER` (長さ, タイプ) `TEXT` (表示長, プライマリ記憶長, オーバーフロー記憶長, エキステントへのポインタ数) `NLSCHAR`または`NLSCHARACTER` (長さ, タイプ) `NLSTEXT` (表示長, プライマリ記憶長, オーバーフロー記憶長, エキステントへのポインタ数)
Date | `DATE` (フォーマット) `TIME` (フォーマット) `MICROTIMESTAMP` (フォーマット)
Decimal | `DECIMAL`または`DEC` (最大の数, 小数位の数) `DOLLAR` (最大のドル数字, フォーマット)
Float | `REAL` `FLOAT` (小数位の数) `LONGFLOAT`または`DOUBLE PRECISION`
Integer | `INTEGER`または`INT` `LONGINTEGER` `SHORTINTEGER`または`SMALLINT`
User Interpreted (Byte Stream) | `MULTIMEDIA`または`BULK` (表示長, プライマリ記憶長, オーバーフロー記憶長, エキステントへのポインタ数)

上にリストされたデータタイプはすべて、最大長、表示フォーマットなどのような 明示的暗黙のパラメータに従います。 これらのデータタイプ、ユーザデータタイプと呼ばれます。 値がそれらのパラメータに対して指定されない場合、省略値が使用されます。 これらの省略値は次のセクションで説明されます。

Empressは、さらにパラメータに従わない汎用データタイプの概念 を持っています。例えば、総括的な整数は数字のシーケンスです。 表現の結果が任意のフィールドに関係していないので、総括的な値は表現の評価に 起因します。例えば、(`loans.amount*0.2`)は総括的な10進の値を産出します。 幅制御は総括的な値のディスプレイに供給され、本章の終わりに記述されます。

## 3.2 データタイプ範囲

次のテーブルは異なるEmpressデータタイプの範囲(最小値と最大値)を リストします。第1のテーブルは、Empressのパラメータのデータ範囲 (フィールドに関連した値）をリストします。第2のテーブルは、 Empress汎用データのための範囲(定数あるいは表現の結果)をリストします。

### 3.2.1 パラメータデータタイプ

パラメータのデータタイプは以下のとおりです。

Table 3-2: パラメータデータタイプ

タイプ | 範囲
`CHAR` | 1〜Cのinteger最大値、231-1バイト
`NLSCHAR` | 1〜Cのinteger最大値、231-1バイト
`TEXT` | 1〜Cのinteger最大値、231-1バイト
`NLSTEXT` | 1〜Cのinteger最大値、231-1バイト
`DATE` | `yyyymmdd`フォーマット、00000101〜99991231 (January 1, 0000〜December 31, 9999)
`TIME` | January 1, 1970 00:00:00〜December 31, 2035 23:59:59
`MICROTIMESTAMP` | January 1, 0000 00:00:00.000000からDecember 31, 9999 23:59:59.999999
`DECIMAL` | 1〜38
`DOLLAR` | 1〜13
`REAL` | システム依存、4バイトの単精度FLOAT
`FLOAT` | システム依存、小数桁数が1〜6の場合は4バイトの単精度FLOAT、 小数桁数が7〜12の場合は8バイトの倍精度FLOAT
`LONGFLOAT` | システム依存、8バイトの倍精度FLOAT
`INTEGER` | -32767〜32767 (215-1)
`LONGINTEGER` | -2147483647〜2147483647 (231-1)
`SHORTINTEGER` | -127〜127 (27-1)
`BULK` | 1〜Cのinteger最大値、231-1バイト

### 3.2.2 汎用データタイプ

汎用データ・タイプおよびそれらの範囲は次のとおりです。

Table 3-3: 汎用データタイプ

タイプ | 範囲
`CHAR` | 1〜Cのinteger最大値、231-1バイト
`INTEGER` | -2147483647〜2147483647 (231-1)
`DECIMAL` | 1〜83(小数点前42、小数点後41)
`FLOAT` | システム依存、8バイトの倍精度FLOAT
`DATE` | yyyymmddフォーマット、00000101〜99991231 (January 1, 0000〜December 31, 9999)

## 3.3 文字データ

4種類の文字データ・タイプがあります。 `CHAR`または`CHARACTER`は通常の文字列のために、`NLSCHAR` または`NLSCHARCTER`は16ビット文字列用に、`TEXT`, `NLSTEXT`は可変長テキスト用にあります。

### 3.3.1 CHARACTERデータタイプ

`CHAR`データ・タイプは、1文字以上から成る文字列を格納します。 バイト数は、単一のバイトからC int(32ビットの機械上の典型的にはの 231-1バイト)の最大値まで指定することが可能です。 受入れ可能なデータは、ブランク、下線、任意の大文字か小文字、印刷可能か 印刷可能でない文字、任意の数字あるいは文字です。

印刷可能でない文字は`CHAR`タイプ3のみに格納されます。

タイプ`CHAR`の属性は以下のように指定されます。

       attr CHAR [ (length [, type]) ]

説明

`length` | バイト数(省略値25).
`type` | 1, 2, 3 (省略値1).

タイプ1は、入力中の前後のブランクを切り捨て、印刷可能な文字だけを受け付け ます（改行は含まれない）。 例えば名前:

       "    John P. Doe   "

と

       "John P. Doe"

は`CHAR`タイプ1として入力される場合同一となります。

タイプ2は、データが入力されたとおりに正確に保存し、印刷可能な文字だけを 受け付けます。もし`CHAR`タイプ2として入力されれば、 `CHAR`タイプ1の例として使用した2つの名前は異なります。

タイプ3は、データが入力されたとおりに正確に保存し、また入力として `NULL`(\0)以外のどんな有効なASCII文字も受け付けます。 newline(キャリッジリターンラインフィードコンビネーション)は<Return>を 押す直前にバックスラッシュ(\)をタイプすることにより、`CHAR`タイプ3に 対し<Linefeed>として保存されます("\"文字は保存されません)。 バックスラッシュはシステム変数`MSLINECONT`の中で設定されている Empressライン継続文字です。これが変更された場合、`MSLINECONT`に よって設定した文字を使用しなくてはなりません。

SQLインターフェース`INSERT`あるいは`UPDATE`コマンドの中、 あるいは`WHERE`句の中で使用される`CHAR`属性用データは、 引用符で囲んで指定します。それによりEmpressは、データの始まりおよび 終了を判別することができます。 対話型インターフェースの文字データは対話型のインターフェースが データとしてピリオド(.)で始まらない入力を解釈するので引用を囲むことを要求 しません。

`CHAR`タイプ3属性はどんなASCII文字(`NULL`以外の)も格納する ことができますが、制御文字を含んでいるデータがファイルからロードされるか、 クエリー言語によって端末から入力される場合、問題が生じるかもしれません。 これはオペレーティングシステムおよび端末の取扱い人がデータとしてそれらを 認める代わりにある制御文字を解釈するかもしれないからです。 例えば、<Ctrl+D>は通常UNIXシステム上のファイルの端の文字です。 それぞれのシステムでは、両方が端末やファイルからのデータ・エントリーを中止 します。

Empressホスト言語インターフェースのうちの1つで書かれたプログラムを 使用して、データベースへ問題文字を入力することは常に可能です。

#### 3.3.1.1 長い行の入力

オペレーティングシステムは、端末からタイプされた一つの行に幾らかのバイトを 単に格納するので、システムバッファーサイズ(バッファーオーバーフローはシステム からシステムまで変わります)以上のデータを含んでいる行の入力は、特別のステップ を必要とします。

長い行を入力する必要があれば、以下のどちらかの方法で可能です。

1. エディタを使用してファイル中のデータを入力します。そしてinsertまたは update from ファイルコマンド(Empress SQL: User's Guideのファイルからの挿入、更新を参照)でデータを入力 します。

2. 対話型インタフェースにおいて、`.zz`コマンドを使用して システムエディタから長い行を入力します。 (対話型インタフェースを参照 してください。).

ラップアラウンドが生じる場合、自動ラップアラウンドを備えたターミナルは 通常テキストに新しいラインを挿入しません。端末からこの方法で入力されたデータ はいくつかの行から成るように見えるかもしれませんが、もし明示的な新しい行が <Return>あるいは<Linefeed>キーを押すことにより入力されていなけれ ば、それはオペレーティングシステムおよびEmpressによって一つの行として 扱われます。

他方では、自動ラップ(viのような)を備えたいくつかのテキストエディタは ラップポイントでタイプされたテキストに新しい行を挿入することができます。 エディタを使用して、データファイルを作成していれば、これがテーブルへデータを 入力する場合に生じているかチェックするべきです。

`CHAR`データタイプ1および2がデータ値として新しい行を許可しないこと に注意してください。`CHAR`タイプ3および`TEXT`データタイプは 新しい行を許可します。しかし、新しい行が入力される前に、行継続文字(初期値 バックスラッシュ(\)で`MSLINECONT`によって設定されている)がタイプ しなくてはなりません。

### 3.3.2 TEXTデータタイプ

`TEXT`データタイプは、一連のテキストを格納するためにデザインされて います。`TEXT`データは、単一の文字からC int(32ビットマシン上で 231-1バイト)の最大値まで格納することができます。

`TEXT`属性は以下のように定義されます。

       attr TEXT [ (display [, primary [, overflow [, extents ]]])];

where:

`display` | `SQLの対話型のインターフェース`で検索する場合にカラムで表示する 文字数。データを保存する場合には、このパラメーターは影響しません。 省略値は20です。
`primary` | メインテーブルに格納されるバイト数です。最小値は0で、初期値は20です。
`overflow` | オーバーフロー領域のバイト数です。最小値は16で、初期値は20です。
`extents` | オーバーフローファイルのデータ位置を指す、メインテーブルに格納された ポインターの数です。省略値は1です。

#### 3.3.2.1 表示長

`SELECT`か対話型の`INSERT`/`UPDATE`によって Empressがフィールドデータ値を検索する場合は常に、表示長は表示された 行の長さです。

1. `SELECT`については、データ全体を表示するために多くの行を必要と します。`LIST`キーワードを指定して`SELECT`した場合には表示長に 制限されずに表示されます。

2. 対話型の`INSERT`/`UPDATE`については、指定された表示長の 1行だけが残りの文字数と一緒に表示されます。データを更新するために、 Empressエディタあるいはシステムエディタを使用することができます。

一連のテキストを検索した場合、行は表示長の限界まで表示され、次のレコード がに新しい行に表示されます。 表示長に到達した場合、文字列はハイフンなしで途中で切れてしまいます。テキスト に埋め込まれている改行は出力上に保存されています。

テキストの一部としてそれを入力するために行継続文字(省略値(\)、 システム変数`MSLINECONT`によって定義されます)によって改行に先行しなけ ればならないことに注意してください。ただしバックスラッシュは格納されません。

表示長20バイトの`TEXT`属性のフィールドに、1行40バイトの文字列が 4行最後尾に改行コードを伴って格納されている場合、`SELECT`すると8行の 20バイトのラインが表示されることになります。 対話型の`INSERT`/`UPDATE`から、第1のラインの最初の20文字、 およびもう140文字が値にあると述べるメッセージが表示されます。

同じ`TEXT`属性が60の表示長さを持っている場合、`SELECT`の表示 は、4行の40文字を改行コードを伴って表示し各々20のブランクを後に続けて表示 します。したがってテキストカラムは、次の属性カラムからの非常に広いセパレータ を持つように見えます。

60の表示長については、埋め込まれた改行はなしで、データとして属性へ単に 160文字を入力すれば、`SELECT`では3行のライン(終わりで20のブランクで 当てがわれた最後のライン)を表示します。40の表示長は4行のラインを表示します。 20の表示長は8行のラインなどを表示します。

#### 3.3.2.2 プライマリ記憶長

各々の`TEXT`属性値は始めだけテーブルに格納されます。残りは オーバーフローエリアに格納されます。テーブルにはプライマリ記憶長に指定された バイト数格納されます。プライマリ記憶長は、入力あるいは表示されたラインの長さ に依存しません。また、それの変更は表示されたラインの長さに影響しません。

最適なプライマリ記憶長は、格納するデータのタイプに依存します。一般に、 プライマリ記憶長は表示長と同じになります。

2、3行のラインのような短いテキストは、入力されるほとんどのテキスト行を プライマリ記憶に保持し、かつオーバーフロー記憶長を小さく指定することが 最も良い設定です。この場合格納領域をあまり使わず、速い検索を得ることが できます。 例えば、`TEXT`データタイプに住所を格納する場合する場合、住所がほとんど 全て4行のラインであるとした場合、プライマリ記憶長を4行のラインをすべて保持 するように十分に大きくしてください。表示長が40バイトである場合、160バイトと してプライマリ記憶長を指定します。 また、それは160バイトの`CHAR`属性よりあなたのテーブルの中でわずかに より多くのディスク容量を使用します。

#### 3.3.2.3 オーバーフロー記憶長

各`TEXT`データタイプ属性については、個別のオーバーフロー記憶 ファイルがメインテーブルに入らないデータを格納するために作成されます。 オーバーフロー記憶長はこのオーバーフローエリアの各範囲に格納されたバイト数 です。(範囲はオーバーフローファイルに割り当てられた記憶装置の1ユニットです。) オーバーフロー記憶長は0として指定されるかもしれません。しかし、 `TEXT`データタイプの目的は無制限の記憶装置です。したがって、 オーバーフロー記憶装置のサイズは0より通常大きくなります。必要により、 複数のラインはオーバーフロー記憶装置に入れられます。また、オーバーフローは 無期限に成長し続けることができます。

現実にオーバーフロー記憶装置を使用しなければ、空のオーバーフローファイル用 のオーバーヘッドは最小となります。本当にオーバーフロー記憶装置を望まなければ、 `TEXT`の代わりに`CHAR`タイプ3を使用するべきです。 それらは改行を受け付けます。 また、`SELECT`での主な違いは`CHAR`タイプ3のための表示長を指定 することができませんが、表示長として属性長を与えられるということです。 オーバーフロー記憶装置からデータを取って来ることは、データのを検索時間を多少 増加させます。

しかし、それが現実に使用される場合、オーバーフロー記憶装置は単に探索されます。 短いオーバーフロー記憶長さを指定すれば、最後のオーバーフローレコードが単に 部分的に満たされる場合、あるいは短いラインをタイプインしていれば、ディスク 容量はほとんど浪費されないでしょう。) しかしながら、多くのオーバーフローレコードがある場合には大きなオーバーヘッド が発生するでしょう。 対照的に、大きなオーバーフロー記憶長を小さくした場合より少ない時間で処理 します。これはレコードにアクセスすることに関係します。

#### 3.3.2.4 エキスタントへのポインタ数

オーバーフローファイル中のデータはツリー構造として組織されています。 オーバーフローファイルの各データ範囲はデータブロックである領域と、 次のデータブロックへのポインタを保持するポインターブロックから構成されて います。 可変長のデータがテーブルに挿入される場合、オーバーフローデータは隣接する領域 (それが可能な場合は常に)あるいは隣接しない領域(それがシステムによって許容可能 でない場合)のいずれかに格納されます。 オーバーフローデータが隣接する領域に格納されるか、メインテーブル(パラメータ 範囲)の中に全てのポインターを保存する十分なスペースがある場合、 オーバーフローファイル中にはポインターブロックは必要ありません。

オーバーフローファイルの中で要求された領域の近似の数が判る場合、パフォーマン を向上させるためにオーバーフローファイル中の領域がすべて直接アクセス可能に なりえるように、属性パラメーター中の`エキステント`への ポインタ数を指定します。

### 3.3.3 NLSCHARACTERデータタイプ

`NLSCHARACTER`データタイプは、16ビットの文字を格納できる事以外は、 `CHARACTER`データタイプと同一です。

### 3.3.4 NLSTEXTデータタイプ

`NLSTEXT`データタイプは、16ビットの文字を格納できる事意外は、 `TEXT`と同一です。

## 3.4 日付データ

日付を格納するための3つのデータタイプがあります。

- `DATE`データタイプは、一般的な日月年の日付。
- `TIME`データタイプは、時間と日付データ。
- `MICROTIMESTAMP`データタイプは、時間と日付およびマイクロ秒情報。

### 3.4.1 DATEデータタイプ

`DATE`データタイプは特に日付の格納のために設計されています。 `DATE`属性は次のように指定されます。

       attr DATE [ (type) ]

説明

`type` | 0から12。`type` が指定されない場合、初期値は0です。

13の異なる`DATE`データタイプは一般的な日付フォーマットをカバー しており、以下のとおりです。

Table 3-4: Empress DATEデータタイプフォーマット

タイプ | フォーマット | 年範囲 | 例
0 | yyyymmdd | 0000-9999 | 19980627
1 | dd aaaaaaaaa yyyy | 0000-9999 | 27 June 1998
2 | aaaaaaaaa dd, yyyy | 0000-9999 | June 27, 1998
3 | mm/dd/yy | nnnn-nnnn+99 * | 06/27/98
4 | dd/mm/yy | nnnn-nnnn+99 * | 27/06/98
5 | dd aaa yy | nnnn-nnnn+99 * | 27 Jun 98
6 | aaa dd, yy | nnnn-nnnn+99 * | Jun 27, 98
7 | mm/dd/yyyy | 0000-9999 | 06/27/1998
8 | dd/mm/yyyy | 0000-9999 | 27/06/1998
9 | yyyy/mm/dd | 0000-9999 | 1998/06/27
10 | yy/mm/dd | nnnn-nnnn+99 * | 98/06/27
11 | yyyy年mm月dd日 | 0000-9999 | 1998年06月27日
12 | yy年mm月dd日 | nnnn-nnnn+99 * | 98年06月27日

*
  `nnnn`は、Empressシステム変数`MSDATELIMIT` (日付として入力できる最も小さな西暦)によって定義されます。

入力においては、日付タイプによりが、日、月および年のオーダーを決定します。 出力においては、日付タイプが表示フォーマットを決定します。

月は、2つの数字、英語表記あるいは3文字の略語として扱われます。 例えば4月は、`April`、`04月`、`APR`、`Apr`、 `04`として扱われます。

DATEタイプ0、1、2、7、8、9、11(4桁で年を扱うタイプ)については、0000年から 9999年までの入力が可能です。

その他の年を2桁で扱う日付タイプは、Empressシステム変数 `MSDATELIMIT`によってセットされた西暦から始まり、99年後までしか入力 できません。詳細に関してはDatabase Administrator's Guideを参照 してください。

日付データはスラッシュでフォーマットされ表示されますが、入力時にはハイフン 、カンマで区切っても入力は可能です。 例えば、`27-06-1998`および`27,06,1998`は、日付タイプ8として 入力されます。しかし、検索される場合は`27/06/1998`として表示されます。

#### 3.4.1.1 今日の日付

全ての`DATE`タイプにその日の日付を入力する場合には、`TODAY` あるいは`NOW`のいずれかを入力します。 また入力時に大文字でも小文字でも適切なフォーマットで現在の日付を格納します。

#### 3.4.1.2 汎用日付フォーマット

すべての`DATE`データタイプは、"`yyyymmdd`" フォーマットで書かれた日付を受け付けます。 この日付フォーマットはデータ入力および比較の両方で使用することができます。

#### 3.4.1.3 カスタマイズされた日付入力フォーマット

Empressは日付を入力する場合、システム変数`MSDATEPIC`(好みの フォーマットを指定します)に月および年の設定ができます。それは、検索結果の表示 フォーマットに影響しません。

この変数をセットする主要な効力は日付データの日、月および年の順序が決定 できることです。Empressはこのフォーマットで入力されたデータを適切な 形式に変換し保存します。

`MSDATEPIC`は次に示すようにセットされます。`d`は日数字用、 `m`は月数字用、`a`は月文字用、`y`は年数字用です。 フォーマットはダブルクォートで囲まれた多くの文字あるいは数字から構成されます。 `MSDATEPIC`の初期値は次のとおりです。

       dd aaaaaaaaa yyyy

#### 3.4.1.4 日付の解釈

日付データが日付フィールドに入力される場合、以下のように評価されます。

1. Empressは、データが汎用日付フォーマット(`yyyymmdd`)を 使用して、有効な日付にすることができるかどうか最初にチェックし、 問題なければそのデータを入力します。

2. データが普汎用日付フォーマットでない場合、Empressは、その フィールドの`DATE`タイプのフォーマットによって決定された日、月、年 オーダーを使用して、有効な日付か、データを入力できるかチェックします。

3. 最後に、上記2つのチェックに失敗した場合、Empressは `MSDATEPIC`に指定されているフォーマットと日、月、年オーダーが一致して いるかチェックします。ここで失敗するとエラーとなります。

例として、`dd aaa yy`にセットされた`MSDATEPIC`で `DATE`タイプ7属性(その正確なフォーマットは`mm/dd/yyyy`である)の 環境の場合。

1998年6月27日の日付に入力するにはに、汎用日付フォーマット`19980627` と`980627`は受入れられます。

`DATE`タイプ7フォーマットとして下記のデータも受け付けます。 月データの`06`は`6`として入力してもかまいません。

       06/27/1998
       06/27/98
       06-27-1998
       06-27-98
       June 27 98

最後に、`MSDATEPIC`によって指定されたオーダーとして下記データを受け 付けます。

       27 Jun 98
       27 Jun 1998
       27 June 1998
       27 June 98
       27 6 1998
       27 6 98
       27 06 1998
       27 06 98

最後の4つのデータではもスペースの代わりにスラッシュかダッシュで入力する ことも可能です。

上記のフォーマットに適合しない次のようなデータは受け付けられません。 `1998 June 27`, `98 jun 27`

#### 3.4.1.5 表現式での日付

表現式での日付指定は、任意の属性に関係していないので、属性に 関連した`DATE`タイプは日付を評価する際に考慮されません。 表現式の中で日付を使用する場合または日付算術を行う場合は、日付データは 汎用日付フォーマットか`MSDATEPIC` の中で指定された形式で指定しなくてはなりません。 （Empress SQL: User's Guideを参照してください。)

#### 3.4.1.6 年を2桁で表すDATEデータタイプ

Empressの日付データタイプで年指定を2桁で表しているものは、システム 変数`MSDATELIMIT`によりその受け入れ範囲を決定します。 `MSDATELIMIT`に1950が設定されている場合には、受け入れ範囲は 1950年〜2044年となります。

### 3.4.2 TIMEデータタイプ

`TIME`データタイプは日付データに時刻情報を加えて保存します。 `TIME`属性は次のように指定されます。

       attr TIME [(type)]

`type`は`DATE`属性(0から12までの数)と同じフォーマット です。`type`の省略値は0になります。

時間は24時間表記(午後3時は15:00:00)を使用して記録されます。年データの受け入れ 範囲は1970年〜2035年となります。

Table 3-5: Empress TIMEデータタイプフォーマット

タイプ | フォーマット | 年範囲 | 例
0 | yyyymmddhhmmss | 1970-2035 | 19980828145615
1 | dd aaaaaaaaa yyyy hh:mm:ss | 1970-2035 | 28 August 1998 14:56:15
2 | aaaaaaaaa dd, yyyy hh:mm:ss | 1970-2035 | August 28, 1998 14:56:15
3 | mm/dd/yy hh:mm:ss | 1970-2035 | 08/28/98 14:56:15
4 | dd/mm/yy hh:mm:ss | 1970-2035 | 28/08/98 14:56:15
5 | dd aaa yy hh:mm:ss | 1970-2035 | 28 Aug 98 14:56:15
6 | aaa dd, yy hh:mm:ss | 1970-2035 | Aug 28, 98 14:56:15
7 | mm/dd/yyyy hh:mm:ss | 1970-2035 | 08/28/1998 14:56:15
8 | dd/mm/yyyy hh:mm:ss | 1970-2035 | 28/08/1998 14:56:15
9 | yyyy/mm/dd hh:mm:ss | 1970-2035 | 1998/08/28 14:56:15
10 | yy/mm/dd hh:mm:ss | 1970-2035 | 98/08/28 14:56:15
11 | yyyy年mm月dd日 hh:mm:ss | 1970-2035 | 1998年08月28日 14:56:15
12 | yy年mm月dd日 hh:mm:ss | 1970-2035 | 98年08月28日 14:56:15

#### 3.4.2.1 現在の時間

`TIME`データタイプフォーマットの全てにおいて、`TODAY` (大文字、小文字または混合も可)を入力すると現在の日付と時間部分に00:00:00が 入力されます。`NOW`を入力すると現在の日付および現在の時間を入力します。 `TIME`データ値は、`DATE`データ値と同じ方法で解釈されます。

### 3.4.3 MICROTIMESTAMPデータタイプ

`MICROTIMESTAMP`データタイプは、`TIME`データとマイクロ秒情報と 格納します。`MICROTIMESTAMP`属性は次のように指定されます。

       attr MICROTIMESTAMP [(type)]

typeは、`TIME`属性(0から12までの数)と同一で、日付部分が表示される フォーマットを指定します。タイプの省略値は0になります。

このデータタイプ日付と時間およびマイクロ秒を格納し、データの受け入れ範囲は 0000年1月1日00:00:00.000000から9999年12月31日23:59:59.999999までで、 最後の6桁がマイクロ秒です。これは`TIME`データタイプの範囲に関する 大きな改良です。

13の異なる`MICROTIMESTAMP`フォーマットを以下に示します。 その出力例は、1998年8月28日午後2:56:15および234599マイクロ秒です。

Table 3-6: Empress MICROTIMESTAMPデータタイプ

タイプ | フォーマット | 年範囲 | 例
0 | yyyymmddhhmmssffffff | 0000-9999 | 19980828145615234599
1 | dd aaaaaaaaa yyyy hh:mm:ss.ffffff | 0000-9999 | 28 August 1998 14:56:15.234599
2 | aaaaaaaaa dd, yyyy hh:mm:ss.ffffff | 0000-9999 | August 28, 1998 14:56:15.234599
3 | mm/dd/yy hh:mm:ss.ffffff | nnnn-nnnn+99 * | 08/28/98 14:56:15.234599
4 | dd/mm/yy hh:mm:ss.ffffff | nnnn-nnnn+99 * | 28/08/98 14:56:15
5 | dd aaa yy hh:mm:ss.ffffff | nnnn-nnnn+99 * | 28 Aug 98 14:56:15.234599
6 | aaa dd, yy hh:mm:ss.ffffff | nnnn-nnnn+99 * | Aug 28, 98 14:56:15.234599
7 | mm/dd/yyyy hh:mm:ss.ffffff | 0000-9999 | 08/28/1998 14:56:15.234599
8 | dd/mm/yyyy hh:mm:ss.ffffff | 0000-9999 | 28/08/1998 14:56:15.234599
9 | yyyy/mm/dd hh:mm:ss.ffffff | 0000-9999 | 1998/08/28 14:56:15.234599
10 | yy/mm/dd hh:mm:ss.ffffff | nnnn-nnnn+99 * | 98/08/28 14:56:15.234599
11 | yyyy年mm月dd日 hh:mm:ss.ffffff | 0000-9999 | 1998年08月28日 14:56:15.234599
12 | yy年mm月dd日 hh:mm:ss.ffffff | nnnn-nnnn+99 * | 98年08月28日 14:56:15.234599

*
  `nnnn`は、Empressシステム変数`MSDATELIMIT` (日付として入力できる最も小さな西暦)によって定義されます。

`MICROTIMESTAMP`データタイプをODBCインタフェースの クライアント／サーバアプリケーションで使用する場合には、 Empress ODBC サーバをバージョン2.2にアップグレードする必要があります。

## 3.5 10進データ

小数位を数に格納するための2つのデータタイプがあります。`DECIMAL` または`DEC`は通常の10進数を、`DOLLAR`は貨幣値を格納するための ものです。

### 3.5.1 DECIMALデータタイプ

`DECIMAL`または`DEC`データタイプは10進のデータを格納し、 数字の総桁数および小数点に続く数字の桁数の２つを指定できます。 `DECIMAL`データは1から38の範囲で指定します。`DECIMAL`属性は 次のように定義されます。

       attr DECIMAL [(total_digits [, decimal_places])]

説明

`total_digits` | 符号と小数点以外の数字の桁数、省略値は1。
`decimal_places` | 小数点以下の桁数、省略値は0。

以下に`DECIMAL`データを異なるパラメータを使用して定義された属性に 対して、どのように格納または検索されるか示したものです。

       入力      (5,2)      (4,2)      (6,4)      (6,0)      (2,0)

       -10        -10.00     -10.00     -10.0000   -10        -10
       .4         0.40       0.40       0.4000     0          0
       1.234567   1.23       1.23       1.2346     1          1
       1.5        1.50       1.50       1.5000     2          2
       10         10.00      10.00      10.0000    10         10
       12.34      12.34      12.34      12.3400    12         12
       21.9       21.90      21.90      21.9000    22         22
       123.4      123.40     ***        ***        123        ***

四捨五入が生じるか注意してください。余分な小数位は最も近い数に四捨五入 されます。アスタリスク(***)の印のあるエントリーは、変換エラーになる ことを示します。 小数点の前にあまりにも大きな数字を入力したり、文字(例えば`abcd`)を入力 した場合に入力変換エラーが発生します。

### 3.5.2 DOLLARデータタイプ

`DOLLAR`データタイプは、貨幣値(正の数または負の数)の格納のために 設計されています。`DOLLAR`値は1から13の数字で指定します。 `DOLLAR`属性は次のように指定されます。

       attr DOLLAR [ (max_digits [ , type])]

説明

`max_digits` | 小数点前の数字の最大の桁数を指定します。最大値は13で省略値は4です。
`type` | 1、2、3のいずれかを指定します。省略値は1です。

タイプ1の`DOLLAR`属性は、データにドル記号を付加して表示します。 タイプ2の`DOLLAR`属性は、ドル記号を付加し、総桁数に満たない場合には アスタリスク(*)を埋め込み表示します。タイプ3の`DOLLAR`属性は、 ドル記号、アスタリスク、コンマのない値を表示します。

`DOLLAR(10,1)`として指定された属性は、9,999,999,999.99ドルまでの値 を格納できます。また、入力データが小数点前10桁に満たない場合は、ドル記号の後 にブランクなしで表示されます(`$1,253.47`)。`DOLLAR(10,2)`として 指定された属性は同じ最大値まで格納でき表示できます。しかし、小数点前10桁に 満たない場合にはドル記号の後にアスタリスクを埋め込みます (`$******1,253.47`)。`DOLLAR(10,3)`として指定された属性は同じ 最大値まで格納でき表示できます。 しかし、ドル記号、コンマ、アスタリスクは表示されません(`1253.47`)。

`DOLLAR`データがSQLの`INSERT`あるいは`UPDATE`コマンド や、WHERE句の中で使用される場合ドル記号を2度タイプする必要があります。 これはEmpressにEmpress変数とそれを混同させないためです。 ただし対話型インターフェース経由でドル記号付きでドルデータを入力する 場合には、ドル記号を2度タイプする必要はありません。

#### 3.5.2.1 カスタマイズされたドルフォーマット

Empressシステム変数`MSDOLLAR`は`DOLLAR`データタイプ のための入力と出力のフォーマットをコントロールするために使用されます。 この変数には文字列で最大50文字まで指定できます。1番目の文字はドルとセントを 分離するセパレータです。2番目は千単位のセパレータです。3番目は埋め込み文字 (`DOLLAR`タイプ2用の)です。残りの文字列は先頭に付加する通貨記号です。

`MSDOLLAR`に対する初期値は以下のとおりです。

        .,*$

ドイツの通貨用に変更する場合には、`MSDOLLAR`に次のものをセットします。

       ,.*DM

`DOLLAR(6,2)`と指定した場合、以下のように表示します。

       DM**1.234,56

米国の通貨用に変更する場合には、`MSDOLLAR`に次のものをセットします。

       ., US$

以下のように表示します。

       US$ 1,234.56

ドルデータは`SELECT`コマンドと同一のスタイルでファイルや クエリー言語から入力されます。

千単位のセパレータにピリオド(.)を指定する場合は注意してください。 対話型インターフェース経由でドルデータを入力する場合、999より大きな値 を千単位のセパレータを付けてタイプすると、Empressは小数点と混同して しまいます。

したがって、`MSDOLLAR`に"`,.*DM`"と指定した場合 に、次の数値を入力すると。

       入力値           10進の値

       1.234,56         1234.56
       DM1.234          1234.00
       1.234,           1234.00
       1.234.567        1234567.00

`1.234`の入力は、`DM1.234,00`ではなく、`1.23`の10進の 値を格納してしまいます。

## 3.6 浮動小数点データ

フロートデータは、10進の値を数のような非整数数値に格納することができます。 フロートデータは3つのタイプがあります。

- `FLOAT`
- `LONGFLOAT`または`DOUBLE PRECISION`
- `REAL`

FLOATデータ属性は次のいずれかで指定できます。

       attr FLOAT [小数点位置]
       attr LONGFLOAT
       attr REAL

`REAL`データタイプは、7つの有効数字(正確な数はEmpressが起動 されているマシンに依存します)として表わされ(10342は`1.034200e+04`として 表示されます、また、0.010342が`1.034200e-02`として表示されます)ます。 検索上で科学的記数法中で表わされ、使用しているマシンに依存して変わりますが、 格納されたデータ値は非常に大きくなります。

`LONGFLOAT`または`DOUBLE PRECISION`データは16の有効数字として 格納され、科学的記数法中で検索されます。`LONGFLOAT`に格納された値の 正確な範囲はマシンに依存します。

`FLOAT`によって格納された正確の数字の数は、ユーザ(システムの制限に 従う)によってセットされます。 小数位の数が1と6の間にある場合、それは`REAL`(4バイトの単精度フロート)と 同じです。小数位の数が7と12の間にある場合、それは8バイトの `DOUBLE PRECISION`フロートです。

## 3.7 整数データ

3つのタイプの整数データがあります。

- `INTEGER`または`INT`
- `SHORTINTEGER`または`SMALLINT`
- `LONGINTEGER`

整数データ属性は次のいずれかをで指定できます。

       attr SHORTINTEGER
       attr [ INTEGER ]
       attr LONGINTEGER

整数タイプは、格納することを計画する数のサイズを考慮して選択します。 `SHORTINTEGER`は-127から127(+/-27-1)までの範囲です。 `INTEGER`は-32767から32767(+/-215-1)までの範囲です。 `LONGINTEGER`は-2147483647から2147483647(+/-231-1)までの 範囲です。`LONGINTEGER`が他の2つのタイプの範囲をカバーするので、 `INTEGER`と`SHORTINTEGER`があることが不必要に思えるかもしれま せん。しかしながら、これらは`LONGINTEGER`によって要求された格納領域の 半分および4分の1をそれぞれ占めます。したがって、与えられた属性に対するすべての データ値があるサイズを超過することがないと判明している場合には、整数タイプの 選択により格納領域を最低限に抑える事ができます。

## 3.8 ユーザインタプリタデータ

`MULTIMEDIA`または`BULK`データタイプは、2進法の表現でC intの 最大値(32ビットのマシンで231-1バイト)までのデータを格納します。 これは、データ値の任意のシーケンスの記憶を可能とします。`BULK`属性は 次のように宣言されます。

|  |  | `attr` | `|BULK |MULTIMEDIA` | `| [(display [, primary [, overflow [, extents]]])]; |`

説明

`display` | データが`SELECT`コマンドによって検索される場合に、1レコード当たりに 表示するバイト数です。データは16進法で表示されます。
`primary` | メインテーブルに格納されるバイト数です。
`overflow` | メインテーブルに格納されないオーバーフロー領域のバイト数です。
`extents` | メインテーブル中に格納されるオーバーフロー領域のポインタ数です。

これらのパラメーターが指定されない場合、長さの省略値は各々20バイトで、 ポインタ数の省略値は1です。これらのパラメーターについては`TEXT`データ タイプについてのセクションを参照してください。

データは手動で入力されるか、あるいはキーワード`DIRECT_FROM`を使用 して、ファイルから直接格納できます。データはどちらの場合も16進法で入力されます。

- 各数が2つの数字である連続的な流れ、ブランクは許可されません。
- ブランクによって分離された1または2桁の数。

2つの入力スタイルを使用して1つのデータ値を作ることはできません。16進法の 数字は一般的なASCII文字です 0-9、A-F(またはa-f)。

データは16進法から2進法へ変換され格納されます。そのフォーマットにより アプリケーションプログラムから直接アクセスすることが可能です。 SQLの`SELECT`からの出力は16進法に再変換され、一つのブランクにより分離し 2桁の数字として表示します(アルファベットは小文字で表示されます)。(内部、外部、 ファイルフォーマットに関しては(内部、外部、ファイルフォーマット についてはEmpress Host Language: C Interface - mx RoutinesとEmpress Host Language: C Kernel Level Interface - mr Routinesを参照してください。)

`BULK`データへのアクセス例は、Empress Host Language: C Kernel Level Interface - mr Routinesマニュアルの BULKデータの操作にある プログラムvoice.cにあります。