Oracle Database に格納可能なデータ型

データ型 一覧(DBに格納できるもの)

テーブルの定義に使用するオラクルデータベースに格納可能なデータタイプについてのスペック一覧である。
PL/SQL においては表現できる各属性の上限値は型によっては異なるスペックになり、 PL/SQL 固有の型 BOOLEAN, PLS_INTEGER なども存在する。
例:データベース VARCHAR2:4000バイト ⇒ PL/SQL VARCHAR2:32767バイト(32K バイト)

属性データ型typ単位適用(上限・精度)
文字VARCHAR21[byte|char Oracle 9i]4000 バイト (≦ 4000 文字)
NVARCHAR21[char]4000 バイト (※1)
※1 UTF8(1〜3byte) 最短 1333 文字
   AL32UTF8(1〜3,6byte) 最短 666 文字
CHAR96[byte|char Oracle 9i]2000 バイト
NCHAR96[char]2000 バイト (※1)
LONG (下位互換)82G-1 バイト
CLOB1124G-1 バイト (〜 Oracle 9i)
標準ブロックサイズ×(4G-1) バイト Oracle 10g
数値NUMBER2(精度,位取り)精度(38桁)、位取り(-84〜127桁)
BINARY_FLOAT21単精度浮動小数点正の最小 1.17549E-38、最大 3.40282E+38
BINARY_DOUBLE22倍精度浮動小数点正の最小値 2.22507485850720E-308
正の最大値 1.79769313486231E+308
日時DATE12日〜秒-4712/01/01 〜 9999/12/31
-4712/01/01 〜 4712/12/31 (R 8.1 より以前)
TIMESTAMP Oracle 9i180(小数秒の精度)DATE 型に加えてミリ秒、最小でナノ秒単位
TIMESTAMP WITH TIMEZONE181タイムスタンプ型に加えてタイムゾーン情報
TIMESTAMP WITH LOCAL TIMEZONE231タイムスタンプ型にローカルタイムゾーン属性
INTERVAL YEAR TO MONTH182年、月
INTERVAL DAY TO SECOND183日〜秒
バイナリRAW23[byte]2000 バイト
LONG RAW (下位互換)242G-1 バイト
BLOB1134G-1 バイト (〜 Oracle 9i)
標準ブロックサイズ×(4G-1) バイト Oracle 10g
BFILE1144G-1 バイト かつ ファイルシステム依存
ROWID69

他の typ コード一覧

参照: PL/SQL のデータタイプデータ型の格納に必要なバイト数

文字列を格納するデータ型 ( CHAR、VARCHAR )

バイトセマンティクス(未指定時のデフォルト⇔ NLS_LENGTH_SEMANTICS= byte)

CHAR(byte_size [ byte])

固定長文字列 sizeは byte指定(上限: 2000 バイト))
マルチバイト文字の場合、格納できる文字数は一定ではない。
byte_size は省略可能( CHAR = CHAR(1) )

VARCHAR2(byte_size [ byte])

可変長文字列 sizeは byte指定(上限: 4000 バイト)
byte_size の省略はできない

キャラクタセマンティクス Oracle 9i

CHAR(char_size CHAR)

固定長文字列 size は文字数指定(※ 上限: 2000 バイト)
char_sizeは省略可能( CHAR = CHAR(1 CHAR) と同じ意味)

VARCHAR2(char_size CHAR)

可変長文字列 size は文字数指定(※ 上限: 4000 バイト)

(※) 文字列型のバイト数(全角文字のほとんどが 1 文字 2 バイト) ⇒ 文字コード・キャラクタセット 参照

注意

VARCHAR は VARCHAR2 のエイリアス。旧バージョンでは VARCHAR と VARCHAR2 では微妙に異なっていた。 VARCHAR は将来変更される可能性もあるので今のところは使用しないほうが良い。
また、一部のミドルウェアでは所要メモリサイズにおいて差異があるケースもあるので要注意。

古いバージョン(Oracle 7 以前位)の場合、データ型によって上限サイズが CHAR 256 バイトや VARCHAR2 2000 バイトという表記もあるので要注意…でもないか。

各国語文字列を格納するデータ型 ( NCHAR、NVARCHAR2 )

NCHAR(char_size)

固定長文字列 size は char 指定のみ(上限: 2000 バイト(※)
この型で使用できる各国語キャラクタセットは、UTF8、AL16UTF16(データベース作成時に決定) Unicode 以外での作成は不可能(10g)
char_size は省略可能( NCHAR = NCHAR(1) )

(※) 定義は必ず文字単位であるが構築した環境によって NCHAR の1文字の構成バイト数が異なるので格納できない事態が発生する。

NVARCHAR2(char_size)

可変長文字列
size は char 指定 (上限: 4000 バイト)

非常に長い文字列を格納するデータ型 ( LONG )

LONG

下位互換での使用以外は避ける
2GB-1 の可変長文字 1テーブルに 1定義のみ(ライン内に格納されるため 行連鎖 が発生しやすい)
使用したときの制約も多く、効率も悪いためテーブルに使用するのは LOB系にする。
LONG 列の以降の列は、シーケンスアクセスになるため、LONG は表定義の最後に配置する。

格納できる数値の精度を指定したデータ型 ( NUMBER )

NUMBER / NUMBER( p [,s] )

固定小数点 精度p(1〜38桁)、位取りs(-84〜127桁:省略時 0)
精度を省略した場合には、精度、位取りは最大の範囲および精度が使われる。
上下限は絶対値で 1E-130 以上 1E126 未満、サプレスした桁数の最大 38桁というのは、すべてのプラットホームのオラクルで移植性が保証された桁数であり、格納形式(仮数エリア 20 バイト)から 38 桁以上を格納できる数値が存在する。

例) NUMBER(4,1) ⇒ 0.1〜±999.9 を完全に保持する。
    NUMBER(*, 5) ⇒ 5桁のスケールをあらわす。(このときの精度は38となる)
    NUMBER(2, 5) ⇒ 0.00001 〜 ±0.00099 を完全に保持する。
    NUMBER(2, -3) ⇒ 1,000 が最小単位で ±99,000 をあらわす
                     (千の位は丸め(四捨五入される))

数値型のタイプの計算における 暗黙変換 の優先順位は BINARY_DOUBLE > BINARY_FLOAT > NUMBER で NUMBER が一番低い。

データベース内部の格納形式について ⇒ データタイプ(内部形式)

浮動小数点を格納するデータ型 ( BINARY_FLOAT、BINARY_DOUBLE )

2 進数精度による浮動小数点数値

BINARY_FLOAT Oracle 10g

単精度浮動小数点型:32 ビットの浮動小数点数 ( 4 + 1 バイト)
正の最小値 1.17549E-38、正の最大値 3.40282E+38

参照:データベース内部の格納形式について

BINARY_DOUBLE Oracle 10g

倍精度浮動小数点型: 64 ビットの浮動小数点数 ( 8 + 1 バイト)
正の最小値 2.22507485850720E-308、正の最大値 1.79769313486231E+308

データベース内部の格納形式について ⇒ データタイプ(内部形式)

日付を格納するデータ型 ( DATE )

DATE

年月日時分秒(日付型)
データ内部で年(上位2桁)、年(下位2桁)、月、日、時、分、秒をもつ(7 バイト)
整数部で日付、小数部で時分秒の計 7 バイトで保存しているとの勘違い(※)をよく見受ける。

(※) DATE の格納形式について

オラクルの日付型の下限と上限は -4712/01/01 〜 9999/12/31 (Oracle 8.1.x より以前では上限が +4712/12/31)

秒以下の小数部をもつ日付型 ( TIMESTAMP )

TIMESTAMP / TIMESTAMP(p) Oracle 9i

タイムスタンプ (DATE + 秒の小数部をもつ(最小ナノ秒単位) 省略時の精度はp=6(マイクロ秒)
オラクルにあった過去の資料からは現在時刻は gettimeofday システムコールから取得されているとある。(1999年の資料)
(2000年/20xx年問題関連で変更された可能性もあり)
Linux(P4) & 10gではマイクロ秒単位で 7〜9桁は常に0 、Windows ではミリ秒単位の精度になる。ミリ秒以下の精度は OS とハードウェア性能による。UNIX 系のサーバーマシンでは ナノ秒 9桁 も取得可能。
(DBMS_UTILITY.GET_CPU_TIMEOracle 10g は 1/100 秒単位)

TIMESTAMP WITH TIME ZONE Oracle 9i

タイムゾーン付のタイムスタンプ型

TIMESTAMP WITH LOCAL TIME ZONE Oracle 9i

ローカルタイムゾーン付のタイムスタンプ型

期間を格納するデータ型 ( INTERVAL〜(期間型))

INTERVAL YEAR TO MONTH

期間(年月) ⇒ 期間型リテラル を参照

INTERVAL DAY TO SECOND

期間(日〜秒) ⇒ 期間型リテラル を参照

バイナリ型 ( RAW )

RAW(byte_size)

バイナリ 〜2000バイト
他の 文字コード を格納する場合など使用 (参考) UTILITY_RAWパッケージ

非常に長いバイナリを格納するデータ型 ( LOG RAW )

LONG 同様、下位互換目的以外での使用は避ける

LONG RAW

バイナリ 2GB の可変長(LONG 同様 LOBを使う)

ラージオブジェクト (CLOB、NCLOB、BLOB、BFILE) Oracle 9i Oracle 10g

最大格納可能サイズ ブロックサイズ×(4G-1)…最大 8T 〜 128TB(CHUNK サイズ:32KB)バイト(※1)、BFILEでは 4G バイト(Oracle 10g)
「 Oracle 9iでは各最大 4G-1 バイト」 BFILE は OS のファイルシステムによる制限も受ける。

(※1) SQL リファレンスには

4GB から1 を引いたバイト数に LOB 記憶域の CHUNK パラメータの値を掛けた値
とある。(LOB 記憶域の CHUNK サイズのデフォルトは標準ブロックサイズ)
リファレンスマニュアルには
最大サイズ: (4GB - 1)× DB_BLOCK_SIZE 初期化パラメータの値(8 〜 128TB) とある。
CHUNK サイズは標準ブロックより大きくできなかったかな・・? 8TB とか無縁そうだからパス。

CLOB

可変長文字列 (※2)

NCLOB

可変長文字列(Nationalchar版)

BLOB

可変長バイナリ

BFILE

ファイルはオラクルの管理対象外となるため無いため書き換えが自由な反面、読み取り一貫性やロックなどがない。

(※2) データベース内部の格納形式とインライン・アウトライン格納について
データタイプ(内部形式)LOB 型の格納方式BLOB 行の新規作成と読み込み

ROWID

ROWID について



関連事項

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ オラクルサポートセンター