Oracle Database に格納可能なデータ型
データ型 一覧(DBに格納できるもの)
テーブルの定義に使用するオラクルデータベースに格納可能なデータタイプについてのスペック一覧である。
PL/SQL においては表現できる各属性の上限値は型によっては異なるスペックになり、
PL/SQL 固有の型 BOOLEAN, PLS_INTEGER なども存在する。
例:データベース VARCHAR2:4000バイト ⇒ PL/SQL VARCHAR2:32767バイト(32K バイト)
(※1) Oracle 12c において、初期化パラメータ COMPATIBLE = 12.0.0.0以上、MAX_STRING_SIZE = EXTENDED でデータベースを構築またはアップグレードしておく必要がある。従来型と異なる表外格納形式、索引が桁あふれから特殊な方式になることもあってか現行のデフォルト設定ではない。(Oracle12c R2 時点)
(※2) 上限が 4000 バイトの場合、UTF8(1〜4byte) 最短 1333 文字
AL32UTF8(1〜4,6 byte) Oracle 10g R2 (Unicode 4.0) では 最短 666 文字、Oracle 11g (Unicode 5.0) では 1000 文字となる。
Oracle 12c で 初期化パラメータ MAX_STRING_SIZE = EXTENDED で 構築している場合には 8191 文字が上限になる。
⇒ 他の 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 バイト、または、32767 バイト )
byte_size の省略はできない
キャラクタセマンティクス
CHAR(char_size CHAR)
固定長文字列 size は文字数指定(※ 上限: 2000 バイト)
char_sizeは省略可能( CHAR = CHAR(1 CHAR) と同じ意味)
VARCHAR2(char_size CHAR)
可変長文字列 size は文字数指定(※ 上限: 4000 バイト、または、32767 バイト )
(※) 文字列型のバイト数(全角文字のほとんどが 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 バイト、または、32767 バイト )
非常に長い文字列を格納するデータ型 ( 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
単精度浮動小数点型:32 ビットの浮動小数点数 ( 4 + 1 バイト)
正の最小値 1.17549E-38、正の最大値 3.40282E+38
参照:データベース内部の格納形式について
BINARY_DOUBLE
倍精度浮動小数点型: 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)
タイムスタンプ (DATE + 秒の小数部をもつ(最小ナノ秒単位)
省略時の精度はp=6(マイクロ秒)
オラクルにあった過去の資料からは現在時刻は gettimeofday システムコールから取得されているとある。(1999年の資料)
(2000年/20xx年問題関連で変更された可能性もあり)
Linux(P4) & 10gではマイクロ秒単位で 7〜9桁は常に0 、Windows ではミリ秒単位の精度になる。ミリ秒以下の精度は OS とハードウェア性能による。UNIX 系のサーバーマシンでは ナノ秒 9桁 も取得可能。
(DBMS_UTILITY.GET_CPU_TIME は 1/100 秒単位)
TIMESTAMP WITH TIME ZONE
タイムゾーン付のタイムスタンプ型
TIMESTAMP WITH LOCAL TIME ZONE
ローカルタイムゾーン付のタイムスタンプ型
期間を格納するデータ型 ( 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)
最大格納可能サイズ ブロックサイズ×(4G-1)…最大 8T 〜 128TB(CHUNK サイズ:32KB)バイト(※1)、BFILEでは 4G バイト()
「 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 について
関連事項