---
title: "数值类型 - OceanBase 数据库 V4.6.0 | OceanBase 文档中心"
description: 数值类型 OceanBase 数据库支持标准 SQL 数值类型，包括精确数值类型、近似数值类型、存储位值的 BIT 数据类型和扩展类型。 数值类型概述 数值类型分类 OceanBase 数据库当前版本支持的数值类型可以划分为如下四类： 整数类型： BOOL/BOOLEAN/TINYINT 、 SMALLINT 、 M…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.6.0

# 数值类型

更新时间：2026-06-05 08:27:40

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.6.0/zh-CN/700.reference/100.oceanbase-database-concepts/400.database-objects/200.database-objects-of-mysql-mode/200.table-of-mysql-mode/200.data-type-of-mysql-mode/200.numeric-data-type-of-mysql-mode.md)  

OceanBase 数据库支持标准 SQL 数值类型，包括精确数值类型、近似数值类型、存储位值的 BIT 数据类型和扩展类型。

## 数值类型概述

**数值类型分类**

OceanBase 数据库当前版本支持的数值类型可以划分为如下四类：

- 整数类型：`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 | [-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] |
| `SERIAL` | 8 | N/A | [0, 2^64^ - 1] |

**TINYINT**

`TINYINT` 用于表示一个非常小的整数。语法如下：

```sql
TINYINT[(M)] [UNSIGNED] [ZEROFILL]

```

其中，`M` 表示最大显示宽度。最大显示宽度为 255。显示宽度与可以存储的值范围无关。如果为数值列指定 `ZEROFILL`，OceanBase 数据库会自动向该列添加 `UNSIGNED` 属性。

**BOOL/BOOLEAN**

`BOOL/BOOLEAN` 类型是 `TINYINT` 的同义词。零值表示错误，非零值表示正确。示例如下：

```plain
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` 用于表示一个小值整数。语法如下：

```sql
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]

```

**MEDIUMINT**

`MEDIUMINT` 用于表示一个中等大小的整数。语法如下：

```sql
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]

```

**INT/INTEGER**

`INT` 或 `INTEGER` 用于表示一个正常大小的整数。语法如下：

```sql
INT[(M)] [UNSIGNED] [ZEROFILL] INTEGER[(M)] [UNSIGNED] [ZEROFILL]

```

其中，`M` 表示最大显示宽度。最大显示宽度为 255。显示宽度与可以存储的值范围无关。如果为数值列指定 `ZEROFILL`，OceanBase 数据库会自动向该列添加 `UNSIGNED` 属性。​

**BIGINT**

BIGINT 用于表示一个大整数。语法如下：

```sql
BIGINT[(M)] [UNSIGNED] [ZEROFILL]

```

关于 `BIGINT`，需要注意以下事项：

- 所有运算需要使用有符号的 `BIGINT` 或 `DOUBLE` 值，因此不应使用大于 9223372036854775807（63 位）的无符号大整数，BIT 函数除外。否则，在将 `BIGINT` 值转换为 `DOUBLE` 时会出现舍入错误，导致结果中的最后一位数字可能出错。
 - 通过使用字符串存储 `BIGINT`，这样始终可以将精确的整数值存储在 `BIGINT` 列中。在这种情况下，在执行字符串到数字的转换时，不涉及双精度的中间转换。
 - 当两个操作数都是整数值时，-、+ 和 * 运算符使用 `BIGINT` 运算。如果将两个大整数（或函数返回的整数结果）相乘，当结果大于 9223372036854775807 时可能会得到异常的结果。

**SERIAL**

`SERIAL` 数据类型用来表示一个自动递增的大整数（大范围数字）列。`SERIAL` 数据类型默认相当于创建一个 `BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE` 类型的列。使用 `SERIAL` 数据类型能够方便地创建具有唯一标识符的列，尤其适合用作表的主键。

## 定点类型

定点类型为变长、精确数值类型，值域和精度取决于 Precision 和 Scale，以及是否为无符号。

`DECIMAL` 等价于 `NUMERIC`。语法如下：

```sql
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` 可用于与其他数据库系统兼容。

```sql
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 标准中规定的理论值，实际情况可能因硬件或操作系统限制略有不同。

下表为不指定 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 用于表示一个小的（单精度）浮点数。语法如下：

```sql
FLOAT [UNSIGNED] [ZEROFILL]

```

`M` 是可以存储的总位数，`D` 是小数点后的位数。如果省略 `M` 和 `D`，则将值存储到硬件允许的限制范围内。单精度浮点数精确到大约 7 个小数位。

如果为数值列指定 `ZEROFILL`，OceanBase 数据库会自动向该列添加 `UNSIGNED` 属性。如果指定 `UNSIGNED`，则不允许为负值。

#### 说明

- `FLOAT(M,D)` 是 MySQL 的过时语法，不建议用户使用。
 - 由于 `FLOAT` 是单精度浮点数，其最大有效精度不会超过 7 位，当输入的有效精度大于 7 时，只有前 7 位有效数字得到保证，超过部分的数值无法保证。MySQL 也存在这种问题，如果用户需要精确查找，建议用户使用 `DECIMAL` 类型。

`FLOAT` 还支持以下语法：

```sql
FLOAT(p) [UNSIGNED] [ZEROFILL]

```

其中，`p` 表示以位为单位的精度，但仅使用此值来确定结果数据类型为 `FLOAT` 或是 `DOUBLE`。如果 `p` 为 0 到 24，则数据类型变为 `FLOAT`，没有 `M` 或 `D` 值；如果 `p` 为 25 到 53，则数据类型变为 `DOUBLE`，没有 `M` 或 `D` 值。结果列的范围与本节前面描述的单精度 `FLOAT` 或双精度 `DOUBLE` 数据类型相同。​

**DOUBLE**

`DOUBLE` 用于表示正常大小（双精度）浮点数。语法如下：

```sql
DOUBLE [UNSIGNED] [ZEROFILL]

```

其中，`M` 是可以存储总位数，`D` 是小数点后的位数。如果省略 `M` 和 `D`，则将值存储到硬件允许的限制范围内。双精度浮点数精确到大约 15 位小数。

#### 说明

- `DOUBLE[(M,D)]` 是 MySQL 的过时语法，不建议用户使用。由于`DOUBLE` 是双精度浮点数，其最大有效精度不会超过 15 位，当输入的有效精度大于 15 时，只有前 15 位有效数字得到保证，超过部分的数值无法保证。MySQL 也存在这种问题，如果用户需要精确查找，建议使用 `DECIMAL` 类型。
 - OceanBase 数据库中，`D` 的值只支持 0，当设置为非 0 时，会报错"Feature not supportted"。

**DOUBLE PRECISION**

`DOUBLE PRECISION` 是 `DOUBLE` 的同义词。语法如下：

```sql
DOUBLE PRECISION [UNSIGNED] [ZEROFILL], REAL[(M,D)] [UNSIGNED] [ZEROFILL]

```

#### 说明

`DOUBLE PRECISION [(M,D)] ` 是 MySQL 的过时语法，不建议用户使用。如果用户需要精确查找，建议使用 `DECIMAL` 类型。

## BIT-Value 类型

`BIT` 数据类型用于存储位值。

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

语法如下：

```sql
BIT[(M)]

```

`M` 表示每个值的位数，范围为 [1，64]。如果省略 `M`，则默认为 1。

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

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
