数据类型 
=========================



OceanBase支持如下数据类型：

* 数值类型

* 日期时间类型

* 字符类型

* 大对象类型

  






数值类型 
-------------

数值类型可以划分为三类：

* 整数类型：`BOOL`/`BOOLEAN`、`TINYINT`、`SMALLINT`、`MEDIUMINT`、`INT`/`INTEGER`、`BIGINT`。




<!-- -->

* 定点类型：`DECIMAL`/`NUMERIC`。




<!-- -->

* 浮点类型：`FLOAT`、`DOUBLE`。

* Bit-Value类型：`BIT`




所有数据类型都可以同时使用`UNSIGNED`关键字声明为无符号类型，这会导致值域发生变化。

数值类型在定义时可以指定precision和scale，不同类型中precision和scale的含义可能有所不同，详情请见各类型详细说明。

整数类型 
-------------

整数类型为定长、精确数值类型，值域取决于类型长度，以及是否为无符号，precision只表示最小显示宽度，详见"ZEROFILL属性"节。以下为相关信息：


|                     类型                      | 长度(字节) |          值域(有符号)          |      值域(无符号)       |
|---------------------------------------------|--------|---------------------------|--------------------|
| `BOOL`/`BOOLEAN`/ `TINYINT` | 1      | \[-2 \^ 7 , 2 \^ 7 - 1\]  | \[0, 2 \^ 8 - 1\]  |
| `SMALLINT`                                  | 2      | \[-2 \^ 15, 2 \^ 15 - 1\] | \[0, 2 \^ 16 - 1\] |
| `MEDIUMINT`                                 | 3      | \[-2 \^ 23, 2 \^ 23 - 1\] | \[0, 2 \^ 24 - 1\] |
| `INT`/`INTEGER`                             | 4      | \[-2 \^ 31, 2 \^ 31 - 1\] | \[0, 2 \^ 32 - 1\] |
| `BIGINT`                                    | 8      | \[-2 \^ 63, 2 \^ 63 - 1\] | \[0, 2 \^ 64 - 1\] |





`BOOL`等价于`BOOLEAN`，这两个类型又等价于`TINYINT(1)`。

`INT`等价于`INTEGER`。

定点类型 
-------------

定点类型为变长、精确数值类型，值域和精度取决于precision和scale，以及是否为无符号。precision和scale分别表示十进制下的总最大有效位数、小数部分最大有效位数，整数部分最大有效位数等于precision - scale，其中precision和scale的最大值分别为65、30，默认值分别为10、0。例如：

* `DECIMAL(5, 2)`，整数部分和小数部分最大有效位数分别为3、2，所以值域为\[-999.99, 999.99\]。

* 如果同时定义为`UNSIGNED`，则值域为\[0, 999.99\]。




`DECIMAL`等价于`NUMERIC`。

#### 浮点类型 

浮点类型为定长、非精确数值类型，值域和精度取决于类型长度、precision和scale，以及是否为无符号。precision和scale分别表示十进制下的总最大有效位数、小数部分最大有效位数，整数部分最大有效位数等于precision - scale，其中precision和scale的最大值分别为53、30。

浮点类型的精度只是IEEE标准中规定的理论值，实际情况可能因硬件或操作系统限制略有不同。

以下为不指定precision和scale时的默认信息：


|    类型    | 长度(字节) |          值域(有符号)          |     值域(无符号)      | 精度  |
|----------|--------|---------------------------|------------------|-----|
| `FLOAT`  | 4      | \[-2 \^ 128, 2 \^ 128\]   | \[0, 2 \^ 128\]  | 7位  |
| `DOUBLE` | 8      | \[-2 \^ 1024, 2 \^ 1024\] | \[0, 2 \^ 1024\] | 15位 |





如果指定precision和scale，则值域确定方法与定点类型相同。

#### ZEROFILL属性 

数值类型在定义时可以通过ZEROFILL关键字指定最小显示宽度，同时将该类型隐式定义为UNSIGNED。在数据实际显示宽度不足最小显示宽度时，通过先在小数部分补零到scale上限、再在整数部分补零到precision上限的方式，将显示宽度补足到最小显示宽度。例如：

* `INT(5) ZEROFILL`：当数据值为`123`时，将显示为`00123`。

* `DECIMAL(10, 5) ZEROFILL`：当数据值为`123.456`时，将显示为`00123.45600`。

  






#### BIT-Value类型 

BIT数据类型用于存储bit values。一个BIT(M)能够存储M-bit的值，M的范围是1\~64。

bit value通过b'value'的形式指定， **value** 是用0和1来指定的，例如,b'111'表示7，b'10000000'表示128。

当向BIT(M)列插入值时，如果插入值的长度小于 **M** ，则会在左侧填充0。例如：将b'101'插入到BIT(6)时，相当于插入了b'000101'。

日期时间类型 
---------------

以下为相关信息：


|     类型      |                格式                |             下界             |             上界             |     含义      |
|-------------|----------------------------------|----------------------------|----------------------------|-------------|
| `DATETIME`  | YYYY-MM-DD HH:MM:SS\[.fraction\] | 0000-01-01 00:00:00.000000 | 9999-12-31 23:59:59.999999 | 日期时间(不考虑时区) |
| `TIMESTAMP` | YYYY-MM-DD HH:MM:SS\[.fraction\] | 0000-01-01 00:00:00.000000 | 9999-12-31 23:59:59.999999 | 日期时间(考虑时区)  |
| `DATE`      | YYYY-MM-DD                       | 0000-01-01                 | 9999-12-31                 | 日期          |
| `TIME`      | HH:MM:SS\[.fraction\]            | -838:59:59.000000          | 838:59:59.000000           | 时间          |
| `YEAR`      | YYYY                             | 1901                       | 2155                       | 年份          |





`DATETIME`、`TIMESTAMP`、`TIME`的值域和精度取决于scale。该属性表示小数部分最大有效位数，最大值为6，默认值为0。

字符类型 
-------------

以下为普通字符类型相关信息：


|     类型      | 长度 |         定义长度上限(字符)          |    字符集    |
|-------------|----|-----------------------------|-----------|
| `VARCHAR`   | 变长 | 262144 / 256K               | `UTF8MB4` |
| `VARBINARY` | 变长 | 1048576 / 1M                | `BINARY`  |
| `CHAR`      | 定长 | 256                         | `UTF8MB4` |
| `BINARY`    | 定长 | 256                         | `BINARY`  |
| `enum`      | 变长 | 最多定义65535个元素，每个元素长度最多255个字符 | `UTF8MB4` |
| `set`       | 变长 | 最多定义64个元素，每个元素长度最多255个字符    | `UTF8MB4` |



大对象类型 
--------------

以下为大对象类型相关信息：


|      类型      | 长度 |   存储长度上限(字节)   |    字符集    |
|--------------|----|----------------|-----------|
| `TINYTEXT`   | 变长 | 256            | `UTF8MB4` |
| `TINYBLOB`   | 变长 | 256            | `BINARY`  |
| `TEXT`       | 变长 | 65536 / 64K    | `UTF8MB4` |
| `BLOB`       | 变长 | 65536 / 64K    | `BINARY`  |
| `MEDIUMTEXT` | 变长 | 16777216 / 16M | `UTF8MB4` |
| `MEDIUMBLOB` | 变长 | 16777216 / 16M | `BINARY`  |
| `LONGTEXT`   | 变长 | 50331648 / 48M | `UTF8MB4` |
| `LONGBLOB`   | 变长 | 50331648 / 48M | `BINARY`  |



