暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

OceanBase系统架构数据类型

2023-12-03
1728

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

数值类型概述

数值类型分类

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

  • 整数类型:BOOL/BOOLEAN/TINYINTSMALLINTMEDIUMINTINT/INTEGER 和 BIGINT

  • 定点类型: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/BOOLEANTINYINT1[-27, 27 - 1][0, 28 - 1]
SMALLINT2[-215, 215 - 1][0, 216 - 1]
MEDIUMINT3[-223, 223 - 1][0, 224 - 1]
INT/INTEGER4[-231, 231 - 1][0, 232 - 1]
BIGINT8[-263, 263 - 1][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 列中。在这种情况下,在执行字符串到数字的转换时,不涉及双精度的中间转换。

  • 当两个操作数都是整数值时,-、+ 和 * 运算符使用 BIGINT 运算。如果将两个大整数(或函数返回的整数结果)相乘,当结果大于 9223372036854775807 时可能会得到异常的结果。

定点类型

定点类型为变长、精确数值类型,值域和精度取决于 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 标准中规定的理论值,实际情况可能因硬件或操作系统限制略有不同。

下表为不指定 Precision 和 Scale 时浮点类型所需的存储长度和值域。

类型长度(字节)值域精度
FLOAT4[-3.402823466E+38, -1.175494351E-38]、0 和 [1.175494351E-38,3.402823466E+38]7 位
DOUBLE8[-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 类型。
  • OceanBase 数据库中,D 的值只支持 0,当设置为非 0 时,会报错"Feature not supportted"。

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 supportted"。

DOUBLE PRECISION

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

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。

语法如下:

BIT[(M)]

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

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论