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の上限まで0で補うことで、表示幅を最小表示幅まで補います。
例:
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に変換する際に丸め誤差が発生し、結果の最後の桁が間違っている可能性があります。文字列を使用して
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はそれぞれ、小数点以下の有効桁数の合計、小数部の最大有効桁数を表します。整数部の最大有効桁数はPrecisionからScaleを引いた値に等しく、Precisionの最大値は53、Scaleの最大値は30です。
注意
浮動小数点型の精度はIEEE標準で規定されている理論値にすぎず、実際の状況ではハードウェアやOSの制限により若干異なる場合があります。
以下の表は、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'値' の形式で指定され、値 は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' を挿入したことになります。