OceanBaseデータベースは、標準SQLの数値型をサポートしており、精度のある数値型、近似数値型、ビット値を格納するBITデータ型、および拡張型が含まれます。
数値型の概要
数値型の分類
OceanBaseデータベースの現在のバージョンでサポートされている数値型は、以下の4つのカテゴリに分類できます:
整数型:
BOOL/BOOLEAN/TINYINT、SMALLINT、MEDIUMINT、INT/INTEGER、BIGINTおよびSERIAL。固定小数点数型:
DECIMALおよびNUMERIC。浮動小数点数型:
FLOATおよびDOUBLE。Bit-Value型:
BIT。
数値型を定義する際には、Precision(精度、フィールドの長さ)とScale(範囲、小数点以下の桁数)を指定できます。数値型ごとにPrecisionとScaleの意味が異なる場合があるため、詳細については各型の説明を参照してください。
ZEROFILL属性
数値型を定義する際に ZEROFILL キーワードを使用すると、最小表示幅を指定し、その型を暗黙的に UNSIGNED と定義します。データの実際の表示幅が最小表示幅に満たない場合、まず小数部をScaleの上限までゼロ埋めし、次に整数部をPrecisionの上限までゼロ埋めすることで、表示幅を最小表示幅に補います。
例:
INT(5) ZEROFILLは、データ値が123の場合、00123と表示されることを意味します。DECIMAL(10, 5) ZEROFILLは、データ値が123.456の場合、00123.45600と表示されることを意味します。
整数型
整数型は固定長で正確な数値型であり、値の範囲は型の長さと符号があるかどうかによって決まります。Precisionは最小表示幅を表すだけです。
OceanBaseデータベースがサポートする各整数型に必要なストレージ長と値の範囲は、次の表のとおりです。
型 |
バイト数 |
値の範囲(符号あり) |
値の範囲(符号なし) |
|---|---|---|---|
BOOL/BOOLEAN/ TINYINT |
1 | [-27, 27 - 1] | [0, 28 - 1] |
SMALLINT |
2 | [-215, 215 - 1] | [0, 216 - 1] |
MEDIUMINT |
3 | [-223, 223 - 1] | [0, 224 - 1] |
INT/INTEGER |
4 | [-231, 231 - 1] | [0, 232 - 1] |
BIGINT |
8 | [-263, 263 - 1] | [0, 264 - 1] |
SERIAL |
8 | N/A | [0, 264 - 1] |
TINYINT
TINYINTは非常に小さい整数を表すために使用されます。構文は以下のとおりです:
TINYINT[(M)] [UNSIGNED] [ZEROFILL]
ここで、Mは最大表示幅を表します。最大表示幅は255です。表示幅は格納可能な値の範囲とは関係ありません。数値列にZEROFILLを指定すると、OceanBaseデータベースはその列にUNSIGNED属性を自動的に追加します。
BOOL/BOOLEAN
BOOL/BOOLEAN型はTINYINTの同義語です。ゼロ値はエラーを表し、非ゼロ値は正解を表します。例:
obclient> SELECT IF(0, 'true', 'false');
+------------------------+
| IF(0, 'true', 'false') |
+------------------------+
| false |
+------------------------+
1 row in set
obclient> SELECT IF(1, 'true', 'false');
+------------------------+
| IF(1, 'true', 'false') |
+------------------------+
| true |
+------------------------+
1 row in set
obclient> SELECT IF(2, 'true', 'false');
+------------------------+
| IF(2, 'true', 'false') |
+------------------------+
| true |
+------------------------+
1 row in set
obclient> SELECT IF(2 = FALSE, 'true', 'false');
+--------------------------------+
| IF(2 = FALSE, 'true', 'false') |
+--------------------------------+
| false |
+--------------------------------+
1 row in set
SMALLINT
SMALLINTは小さな整数を表すために使用されます。構文は以下のとおりです:
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
ここで、Mは最大表示幅を表します。最大表示幅は255です。表示幅は格納可能な値の範囲とは関係ありません。数値列にZEROFILLを指定すると、OceanBaseデータベースはその列にUNSIGNED属性を自動的に追加します。
MEDIUMINT
MEDIUMINTは中程度の大きさの整数を表すために使用されます。構文は以下のとおりです:
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
ここで、Mは最大表示幅を表します。最大表示幅は255です。表示幅は格納可能な値の範囲とは関係ありません。数値列にZEROFILLを指定すると、OceanBaseデータベースはその列にUNSIGNED属性を自動的に追加します。
INT/INTEGER
INTまたはINTEGERは通常サイズの整数を表すために使用されます。構文は以下のとおりです:
INT[(M)] [UNSIGNED] [ZEROFILL] INTEGER[(M)] [UNSIGNED] [ZEROFILL]
ここで、Mは最大表示幅を表します。最大表示幅は255です。表示幅は格納可能な値の範囲とは関係ありません。数値列にZEROFILLを指定すると、OceanBaseデータベースはその列にUNSIGNED属性を自動的に追加します。
BIGINT
BIGINTは大きな整数を表すために使用されます。構文は以下のとおりです:
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
ここで、Mは最大表示幅を表します。最大表示幅は255です。表示幅は格納可能な値の範囲とは関係ありません。数値列にZEROFILLを指定すると、OceanBaseデータベースはその列にUNSIGNED属性を自動的に追加します。
BIGINTについては、以下の点に注意する必要があります:
すべての演算では符号付きの
BIGINTまたはDOUBLE値を使用する必要があるため、9223372036854775807(63ビット)を超える符号なしの大整数は使用しないでください。BIT関数は除きます。そうでない場合、BIGINT値をDOUBLEに変換する際に四捨五入エラーが発生し、結果の最後の1文字が誤っている可能性があります。文字列を使用して
BIGINTを格納することで、常に正確な整数値をBIGINT列に格納できます。この場合、文字列から数値への変換を実行する際に、倍精度の中間変換は行われません。2つの演算子がいずれも整数値の場合、-、+、*演算子は
BIGINT演算を使用します。2つの大きな整数(または関数が返す整数結果)を掛け合わせると、結果が9223372036854775807を超えると異常な結果が得られる可能性があります。
SERIAL
SERIALデータ型は、自動インクリメントの大整数(広範囲の数字)列を表すために使用されます。SERIALデータ型は、デフォルトでBIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE型の列を作成することに相当します。SERIALデータ型を使用すると、一意の識別子を持つ列を簡単に作成でき、特にテーブルの主キーとして適しています。
固定小数点数型
固定小数点数型は可変長の厳密数値型であり、値の範囲と精度はPrecisionとScale、および符号が符号なしかどうかによって決まります。
DECIMAL は NUMERIC と等価です。構文は以下のとおりです:
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
ここで、M は格納可能な総桁数(Precision)、D は小数点以下の桁数(Scale)です。小数点と負の符号「-」は M に含まれません。D が0の場合、値に小数点または小数部はありません。整数部の最大有効桁数は M から D を引いた値、すなわちPrecisionからScaleを引いた値に等しくなります。
DECIMAL の M の最大値は65、D の最大値は30です。D を省略した場合、デフォルトで0となります。M を省略した場合、デフォルトで10となります。M と D の両方が指定されていない場合、DECIMAL 列に対するすべての基本的な計算(+、-、*、/)は65ビットの精度を使用します。
数値列に ZEROFILL を指定すると、OceanBaseデータベースはその列に UNSIGNED 属性を自動的に追加します。UNSIGNED を指定すると、負の値を格納することはできません。
例えば、DECIMAL(5, 2) は整数部と小数部の最大有効桁数がそれぞれ3と2であることを意味し、値の範囲は [-999.99, 999.99] となります。これを UNSIGNED として定義すると、値の範囲は [0, 999.99] となります。
以下の型も DECIMAL のシノニムです。その中で、FIXED は他のデータベースシステムとの互換性を持たせるために使用できます。
DEC[(M[,D])] [UNSIGNED] [ZEROFILL], NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL],
FIXED[(M[,D])] [UNSIGNED] [ZEROFILL]
浮動小数点数型
浮動小数点数型は固定長で不正確な数値型であり、値の範囲と精度は型の長さ、Precision、Scale、および符号が無符号かどうかによって決まります。
PrecisionとScaleは、それぞれ10進法での有効桁数の合計、小数部の最大有効桁数を表します。整数部の最大有効桁数はPrecisionからScaleを引いた値に等しく、Precisionの最大値は53、Scaleの最大値は30です。
注意
浮動小数点数型の精度はIEEE標準で規定されている理論値にすぎず、実際の動作はハードウェアやオペレーティングシステムの制限によって若干異なる場合があります。
以下の表は、PrecisionとScaleを指定しない場合の浮動小数点数型に必要なストレージ長と値の範囲を示しています。
データ型 |
長さ(バイト) |
値の範囲 |
精度 |
|---|---|---|---|
| FLOAT | 4 | [-3.402823466E+38, -1.175494351E-38]、0 および [1.175494351E-38,3.402823466E+38] | 7 桁 |
| DOUBLE | 8 | [-1.7976931348623157E+308, -2.2250738585072014E-308]、0 および [2.2250738585072014E-308,1.7976931348623157E+308] | 15 桁 |
PrecisionとScaleを指定した場合、値の範囲の決定方法は固定小数点数型と同じです。
FLOAT
FLOATは小さい(単精度)浮動小数点数を表すために使用されます。構文は以下のとおりです:
FLOAT [UNSIGNED] [ZEROFILL]
M は格納できる総桁数、D は小数点以下の桁数です。M と D を省略した場合、値はハードウェアが許可する範囲内に格納されます。単精度浮動小数点数は約7桁の小数まで正確です。
数値列に ZEROFILL を指定すると、OceanBaseデータベースは自動的にその列に UNSIGNED 属性を追加します。UNSIGNED を指定すると、負の値を格納することはできません。
説明
FLOAT(M,D)はMySQLの古い構文であり、使用は推奨されません。FLOATは単精度浮動小数点数であるため、最大有効精度は7桁を超えません。入力された有効精度が7を超える場合、最初の7桁の有効数字のみが保証され、それを超える部分の値は保証されません。MySQLにもこの問題があります。正確な検索が必要な場合は、DECIMAL型の使用を推奨します。
FLOAT は以下の構文もサポートしています:
FLOAT(p) [UNSIGNED] [ZEROFILL]
ここで、p はビット単位の精度を表しますが、この値は結果のデータ型が FLOAT か DOUBLE かを決定するためにのみ使用されます。p が0から24の場合、データ型は FLOAT になり、M または D の値はありません。p が25から53の場合、データ型は DOUBLE になり、M または D の値はありません。結果列の範囲は、このセクションの前半で説明した単精度 FLOAT または倍精度 DOUBLE データ型と同じです。
DOUBLE
DOUBLE は通常サイズ(倍精度)の浮動小数点数を表すために使用されます。構文は以下のとおりです:
DOUBLE [UNSIGNED] [ZEROFILL]
ここで、M は格納できる総桁数、D は小数点以下の桁数です。M と D を省略した場合、値はハードウェアが許可する範囲内に格納されます。倍精度浮動小数点数は約15桁の小数まで正確です。
数値列に ZEROFILL を指定すると、OceanBaseデータベースは自動的にその列に UNSIGNED 属性を追加します。UNSIGNED を指定すると、負の値を格納することはできません。
説明
DOUBLE[(M,D)]はMySQLの古い構文であり、使用は推奨されません。DOUBLEは倍精度浮動小数点数であるため、最大有効精度は15桁を超えません。入力された有効精度が15を超える場合、最初の15桁の有効数字のみが保証され、それを超える部分の値は保証されません。MySQLにもこの問題があります。正確な検索が必要な場合は、DECIMAL型の使用を推奨します。- OceanBaseデータベースでは、
Dの値は0のみをサポートします。0以外の値に設定すると、「Feature not supported」というエラーが発生します。
DOUBLE PRECISION
DOUBLE PRECISION は DOUBLE の同義語です。構文は以下のとおりです:
DOUBLE PRECISION [UNSIGNED] [ZEROFILL], REAL[(M,D)] [UNSIGNED] [ZEROFILL]
説明
DOUBLE PRECISION [(M,D)] はMySQLの古い構文であり、使用は推奨されません。正確な検索が必要な場合は、DECIMAL 型の使用を推奨します。
BIT値型
BIT データ型は、ビット値を格納するために使用されます。
ビット値は b'value' の形式で指定します。value は0と1で指定され、例えば、b'111' は7を表し、b'10000000' は128を表します。
構文は以下のとおりです:
BIT[(M)]
M は各値のビット数を表し、範囲は [1,64] です。M を省略した場合、デフォルトで1になります。
BIT(M) 列に値を挿入する際、挿入する値の長さが M より短い場合、左側に0が埋め込まれます。例えば、b'101' を BIT(6) に挿入すると、b'000101' を挿入したことと同じになります。