YashanDB 数值型数据
数值型数据包括正负整数、小数、0、正负无穷(Inf、-Inf)、以及非数(Nan),主要应用于数学运算、数字计量等场景。YashanDB 支持对此类数据的加减乘除取模运算,并提供统计函数和聚集函数来满足各式场景的需求。
可以将数值型数据进一步划分为整数类型(Integer Data Type)、浮点类型(Floating-Point Data Type)、NUMBER 类型(Number Data Type)、以及 BIT 类型(Bit Data Type)。YashanDB 为不同的数值类型定义了值域、字节长度、精度等属性。
整数类型为定长、精确数值类型,是没有小数部分的整数,具体包括 TINYINT、SMALLINT、INT、BIGINT 四种数据类型,每个类型有不同的字节长度和值域,建表时需要根据数据存储所需的空间来决定使用哪一种类型。
INTEGER、PLS_INTEGER/PLS_INTEGER 为 INTEGER 的别名,行为完全同 INT。
整数类型通过十进制精度(Decimal Precision,数字 0~9)存储,在值域和精度范围以内的十进制数字都可以被准确的存储。
INT 类型在语法上支持定义时带精度信息,精度范围为 0 ~ 255。
当配置参数 USE_NATIVE_TYPE 为 FALSE 时,TINYINT、SMALLINT、INT、BIGINT 返回值类型为 NUMBER,precision 为 38,scale 为 0。
示例
# 存储属性

浮点类型(Floating-Point Data Type)
浮点类型为定长、非精确数值类型,具体包括 FLOAT、DOUBLE 两种数据类型。在 YashanDB 中,浮点类型的行为与行业标准 IEEE Standard 754 保持一致。
BINARY_FLOAT、REAL 为 FLOAT 的别名,行为完全同 FLOAT。BINARY_DOUBLE 为 DOUBLE 的别名,行为完全同 DOUBLE。
浮点类型通过二进制精度(Binary Precision,数字 0 和 1)存储。
浮点类型拥有更宽广的值域,可以表达特殊值 Inf、-Inf、Nan,对小数点的位置也没有限制。
无法避免由于二进制精度转换至十进制精度所带来的误差,所以一些数字无法被浮点数类型准确的表达(例如 0.1)。且精度根据 USE_NATIVE_TYPE 配置参数的值存在不同规则:
当 USE_NATIVE_TYPE 为 TRUE 时,YashanDB 只做语法兼容,等价于浮点类型本身(例如 DOUBLE
(p)
等价于 DOUBLE)。当 USE_NATIVE_TYPE 为 FALSE 时,FLOAT 类型不适用于列存表,在行存表中,FLOAT 类型不带精度信息时,默认为 FLOAT(126),FLOAT 后面带精度信息时,精度值为设置值。
# 存储属性

# 使用规则
# 定义格式
浮点类型有如下几种定义格式:
其中,在 USE_NATIVE_TYPE 为 TRUE 时,(m,d)
和(p)
均为语法兼容格式,即支持 DOUBLE(m,d)
和 DOUBLE(p)
语法,但二者均等价于 DOUBLE,无实际含义,但存在如下约束规则:
m:Magnitude,0 < m <= 255
d:Division, 0 <= d <= 30
d <= m
p:Precision,0 <= p <= 53
定义 FLOAT 类型时,0 <= p <= 126 ,大于 53 小于等于 126 的部分会当作 53 处理,如 m 或者 p 值超过 23,系统将类型转换为 DOUBLE 类型
示例
其中,在 USE_NATIVE_TYPE 为 FALSE 时,在实现上支持 FLOAT 缺省或者带精度信息,存在如下规则:
当不带精度信息时, p = 126
当带精度信息时,1 <= p <= 126
示例(HEAP 表)
# 显示方式
浮点类型以科学计数法的形式显示。
# 特殊值
浮点类型有 3 个特殊值:Nan、Inf、-Inf。它们的大小排序为:Nan>Inf>正数>0>负数>-Inf。
下表列示一些特殊场景下将产生这些特殊值或 0:

当浮点数大小超过值域的最大绝对值时,会被表示为 Inf 或-Inf;当浮点数大小小于值域的最小绝对值时,会被表示成 0。
# 精度约束
当浮点类型的实际精度超过其最大精度限制时,超过精度的部分会被舍弃,且舍弃规则无法确定为四舍五入或截断,舍弃后数字的最大精度位的结果也无法预测。
由于存储方式的差异,将其他数值型转换为浮点类型时可能产生无法避免的误差。
因此,浮点类型不适合用在对精确程度要求较高的场景,也不适合用在涉及大量等于比较条件和边界值的场景。
示例
NUMBER 类型(Number Data Type)
NUMBER 类型为非定长、精确的数值类型,它可以自由指定精度(P,Precision)和刻度(S,Scale)。NUMBER 类型可以准确表示符合精度和刻度要求的任何数字,因此非常适合用于需要精确计算且涉及小数的场景。
DECIMAL、NUMERIC 为 NUMBER 的别名,行为完全同 NUMBER。
# 存储属性

# 使用规则
# 定义格式
NUMBER 类型的定义格式为NUMBER(P,S)
或NUMBER
,其中 P 和 S 的含义如下:
P:精度,表示数字的有效位数(不包含小数点、正负符号的位数),取值范围[1,38];也可以为*,表示精度为 38。
S:刻度,表示数字从小数点到最右侧有效数字的位数,取值范围[-84,127]。刻度为正数,表示小数点在最小位数左侧(例如 3.14 的格式定义可以为
NUMBER(3, 2)
);刻度为负数,表示小数点在最小位数右侧(例如 31400 的格式定义可以为NUMBER(3, -2)
)。P-S:表示整数的最大位数。
当定义格式为 NUMBER,不指定 P/S 时,表示为浮动精度。
# 精度约束
不指定 P/S 时为浮动精度,以实际计算产生的值为准,无精度限制。
指定 P/S:
实际刻度超过定义的 S 时,系统将超过的部分四舍五入至最小刻度位。
实际精度超过定义的 P 时,系统报错。
# 支持科学记数法作为值输入
支持诸如 1.24E3 的格式处理。
异常带 E 的数值格式如 E1,1E,1.3E2A 等进行相应报错。
示例
BIT 类型(Bit Data Type)
BIT 类型支持 1-64 位宽度(Size)的二进制位图,每 BIT 位只允许存放 0/1 值,其他值将视为非法 BIT 类型。
以字符串形式插入/更新 BIT 类型时,字母 b 开头的字符串以二进制数值处理,其它以十进制字符串处理。
BIT 类型以二进制输出。
BIT 类型的定义格式为BIT[(Size)]
,Size:表示 BIT 的宽度,取值范围为[1,64]
,省略时,系统取默认值 1。
BIT 类型仅适用于 HEAP 表,分布式行表不支持 Bit 类型。
示例(HEAP 表)
显示宽度调整
SET NUMWIDTH 用于设置浮点类型及 NUMBER 类型数据输出时的显示宽度,只针对当前会话有效。
其中,SET NUMWIDTH=SET NUM,用于设置显示宽度;SHOW NUMWIDTH=SHOW NUM,用于显示设置的宽度值。
系统对浮点类型及 NUMBER 类型数据输出时的显示宽度默认为 10。
YashanDB 对浮点类型数字均采用科学计数法显示,显示格式为:
正数 x.yyyyE{+|-}zzz
负数 -x.yyyyE{+|-}zzz
其中只有 yyyy 显示内容长度受到 width 限制;指数 zzz 固定显示 3 个字节,其前面固定显示符号'+' 或 '-'。
YashanDB 对 NUMBER 类型数字的显示规则如下:
如果是纯小数,则小数点前的 0 会省略不显示。如果纯小数为 0.00000xxx 其中 xxx 为任意数字,则使用科学计数法显示,否则使用非科学计数法显示。
如果是非纯小数,且给定的宽度能够完整输出整数内容,则不会使用科学计数法显示,否则使用科学计数法显示。
NUMBER 类型数字的科学计数法显示格式为:
正数: x.yyyyE{+|-}zz
负数:-x.yyyyE{+|-}zz
其中 yyyy 显示内容长度受到 width 限制;指数 zz 默认 2 个字节,最大 3 个字节,其前面固定显示符号'+' 或 '-'。
# 语句定义
set numwidth::=

show numwidth::=

width
该语句用于指定显示宽度值,值范围为[2,128]
。
当此值设置过小,导致某个数字无法完整显示出来时,系统输出按此值个数的'#'。
示例
版权声明: 本文为 InfoQ 作者【YashanDB】的原创文章。
原文链接:【http://xie.infoq.cn/article/35e9550c18540b82fdcdd87b1】。文章转载请联系作者。
评论