定点类型为变长、精确数值类型,值域和精度取决于 Precision 和 Scale,以及是否为无符号。
DECIMAL 等价于 NUMERIC。语法如下:
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
M 是可以存储的总位数(Precision),D 是小数点后的位数(Scale)。小数点和负数符号"-"不计入 M。如果 D 为 0,则值没有小数点或小数部分。整数部分最大有效位数等于 M 减去 D 的值,即 Precision 减去 Scale 的值。所有带有 DECIMAL 列的基本计算(+、-、*、/)都使用 65 位的精度。
DECIMAL 的 M 最大值为 65,D 最大值为 30。如果省略 D,则默认为 0。如果省略 M,则默认为 10。
如果为数值列指定 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 最大值为 255(Scale 只能为 0),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 用于表示一个小的(单精度)浮点数。语法如下:
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
M 是可以存储的总位数,D 是小数点后的位数。如果省略 M 和 D,则将值存储到硬件允许的限制范围内。单精度浮点数精确到大约 7 个小数位。
如果为数值列指定 ZEROFILL,OceanBase 数据库会自动向该列添加 UNSIGNED 属性。如果指定 UNSIGNED,则不允许为负值。
对于 OceanBase 数据库 V4.0.0 及以上版本,M 的最大值为 255,D 的值只支持 0,当 D 设置为非 0 时,会报错 “ERROR 4381 (HY000): Not supported, deprecated MySQL feature”。在通过 ALTER SYSTEM SET _ENABLE_CONVERT_REAL_TO_DECIMAL = TRUE; 命令开启数据类型转换功能后,数据库会自动把 FLOAT(M,D) 类型自动转换为 DECIMAL(M,D) 类型,不区分 D 是否为 0,M 和 D 最大长度和 DECIMAL 数据类型一致。
说明
FLOAT(M,D)是过时语法,不建议用户使用。
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[(M,D)] [UNSIGNED] [ZEROFILL]
M 是可以存储总位数,D 是小数点后的位数。如果省略 M 和 D,则将值存储到硬件允许的限制范围内。双精度浮点数精确到大约 15 位小数。
在 OceanBase 数据库 V4.0 及以上版本中,M 的最大值为 255,D 的值只支持 0,当设置为非 0 时,会报错"Not supported, deprecated MySQL feature"。
如果为数值列指定 ZEROFILL,OceanBase 数据库会自动向该列添加 UNSIGNED 属性。如果指定 UNSIGNED,则不允许为负值。
说明
DOUBLE[(M,D)]是 MySQL 的过时语法,不建议用户使用。如果用户需要精确查找,建议使用DECIMAL类型。
DOUBLE PRECISION
DOUBLE PRECISION 是 DOUBLE 的同义词。语法如下:
DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL], REAL[(M,D)] [UNSIGNED] [ZEROFILL]



