整数型は固定長であり、正確な値を表すデータ型です。値の範囲は型の長さと符号の有無によって決まります。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属性を追加します。
また、OceanBaseデータベースは拡張型INT2とINT4もサポートしていますが、INT4の代わりにINTを使用することを推奨します。
BIGINT
BIGINTは大きな整数を表すために使用されます。構文は次のとおりです:
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
Mは最大表示幅を表します。最大表示幅は255です。表示幅は格納できる値の範囲とは無関係です。数値列にZEROFILLを指定すると、OceanBaseデータベースは自動的にその列にUNSIGNED属性を追加します。
BIGINTについては、以下の点に注意する必要があります:
すべての演算では符号付きの
BIGINTまたはDOUBLE値を使用する必要があるため、9223372036854775807(63ビット)より大きな符号なしの大整数は使用しないでください。ただし、BIT関数は例外です。そうしない場合、BIGINT値をDOUBLEに変換する際に丸めエラーが発生し、結果の最後の桁が誤っている可能性があります。文字列を使用して
BIGINTを格納することで、常に正確な整数値をBIGINT列に格納できます。この場合、文字列から数値への変換を実行する際に、倍精度の中間変換は不要です。両オペランドが整数値の場合、-、+、*演算子は
BIGINT演算を使用します。2つの大きな整数(または関数が返す整数結果)を掛け合わせると、結果が9223372036854775807を超えると異常な結果が得られる可能性があります。
SERIAL
SERIAL データ型は、自動インクリメントされる大きな整数(広範囲の数値)を表すために使用されます。列定義で SERIAL データ型を使用すると、実際には以下の列プロパティが定義されます:
BIGINT:非常に大きな数値を格納できる大きな整数データ型です。UNSIGNED:この整数は符号なしであり、正の数またはゼロのみを取ります。NOT NULL:列の値は空にすることができず、各行には必ず値が存在しなければなりません。AUTO_INCREMENT:新しい行が挿入されるにつれて、この列の値が自動的に増加する自動インクリメントの識別子です。UNIQUE:列内のすべての値が一意であることを保証します。
具体的には、SERIAL データ型はデフォルトで BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE タイプの列を作成することに相当します。SERIAL データ型を使用すると、一意の識別子を持つ列を簡単に作成でき、特にテーブルの主キーとして使用するのに適しています。
例:
以下のSQLステートメントを使用してテーブル
tbl1を作成し、2つのフィールドを定義します:idフィールドはSERIALデータ型として定義され、nameフィールドはVARCHAR(10)データ型として定義されます。obclient [test]> CREATE TABLE tbl1 (id SERIAL, name VARCHAR(10));以下のSQLステートメントを使用して、テーブル
tbl1の定義を確認します。obclient [test]> SHOW CREATE TABLE tbl1;実行結果は次のとおりです:
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | tbl1 | CREATE TABLE `tbl1` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(10) DEFAULT NULL, UNIQUE KEY `id` (`id`) BLOCK_SIZE 16384 LOCAL ) AUTO_INCREMENT = 1 AUTO_INCREMENT_MODE = 'ORDER' DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 | +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set