使用 DECIMAL(31,0) 的原因
-
19-09-2019 - |
题
一些具有 Oracle 背景的人使用 DECIMAL(31,0) 表示整数的原因是什么?在 MySQL 中它效率不高。
解决方案
Oracle 将“INTEGER”ANSI 数据类型实现为 NUMBER(38) 的同义词
更多详情请参见“学习甲骨文:SQL 和 PL/SQL 的数据类型、数字"
但是,应该使用下表作为 Oracle 和 MySQL 中数据类型之间的映射:
“Oracle® Database SQL Developer MySQL 迁移的补充信息”
Oracle 和 MySQL 比较 > 数据类型 > 比较数据类型
主要区别,如所解释的 这里 和 这里 Oracle NUMBER 数据类型是可变长度格式,而 MySQL DECIMAL(n) 数据类型曾经是 represented as strings that require one byte per digit or sign character
(5.0.3版本之前)
(Oracle NUMBER 数据类型)内部数字格式
Oracle数据库以可变长度格式存储数字数据。每个值都以科学符号存储,使用1个字节来存储指数,最多20个字节存储了曼蒂萨。结果值限制为精确的38位数字。Oracle数据库不存储领先和尾随的零。例如,数字412以类似于4.12 x 102的格式存储,其中1个字节用于存储指数(2)和2个字节,用于存储Mantissa的三个有效数字(4,1,2)。负数包括其长度的标志。
考虑到这一点,可以使用以下公式来计算特定数字数据值(P)的字节中的列大小,其中P是给定值的精度:
ROUND((length(p)+s)/2))+1
如果数字为正,则s等于零,如果数字为负,则等于1。
使用唯一表示形式存储零,正和负的无穷大(仅在Oracle数据库中产生,版本5)。零和无限无穷大需要1个字节;正无穷大需要2个字节。
和
(MySQL) DECIMAL 数据类型更改
分别确定整数和分数部分的存储要求。九位数字的每个数字都需要四个字节,而剩下的任何剩余数字都需要四个字节的一小部分。[...]
例如,十进制(18,9)列在小数点的两侧都有9个数字,因此整数部分和分数部分每个都需要四个字节。十进制(20,6)列有14个整数数字和六个分数数字。整数数字需要四个字节,其中九个数字和剩余五位数字需要三个字节。六个分数需要三个字节。