根据我对 mysql 文档中
DECIMAL
手册的理解,它指出九个数字的每个倍数需要 4 个字节,其余数字如下;
number of digits leftover | bytes
0 | 0
1 | 1
2 | 1
3 | 2
4 | 2
5 | 3
6 | 3
7 | 4
8 | 4
那么
decimal(12,6)
的总存储空间等于 6 个字节吗?
我知道小数部分将始终等于 6 位数字,因为会填充零,但对于
DECIMAL(12,6)
列,整数部分并非如此,存储是按行还是按列定义进行赋值?
示例
DECIMAL(12,6)
1: 178.999999 // 3 digits for integer part so total would be 5 bytes?
2: 0.880000 // 1 digits for integer part so total would be 4 bytes?
3 123456.123456 // 6 digits would equal 6 bytes?
或者如果声明它总是 6 个字节
(12,6)
?
编辑
此外,声明为
(5,5)
的小数将需要 6 个字节来存储,声明为 (12,6)
的小数也将需要 6 个字节来存储。既然存储大小不是问题,那么大小的差异会影响 mysql 检索或索引列的方式吗?
对于MySQL 5.1(及更高版本),它将整数部分和小数部分的存储分开,并为最大可能的数字腾出存储空间。因此,对于 DECIMAL(12,6),整数部分需要 3 个字节,小数部分需要 3 个字节。看起来它并没有根据值减少存储;无论值是多少,它都会将内存放在一边。
您可以在此处查看文档:
DECIMAL(12,6)
1: 178.999999 // 整数部分为 3 位数字,因此总计为 5 个字节(正确) 2: 0.880000 // 整数部分为 1 位,所以总计为 4 个字节?(错误) 3 123456.123456 // 6 位数字等于 6 个字节?(正确)
说明: 剩余位数 字节数 0 0
1 1
2 1
3 2
4 2
5 3
6 3
7 4
8 4
所有 9 的倍数将包含 4 个字节
所以 0.880000 整数部分取 0,小数部分取 3,因此 0+3=3
可以用这个函数计算:
DELIMITER $$
CREATE FUNCTION `fn_DECIMAL_SIZE`(`M` INT, `D` INT) RETURNS int(11)
DETERMINISTIC
BEGIN
set @m = m;
set @d = d;
set @i = @m-@d;
set @size = 4 * floor( @i/9 );
set @size = @size + ceil( (@i % 9) / 2 );
set @size = @size + 4 * floor( @d/9 );
set @size = @size + ceil( (@d % 9) / 2 );
return @size;
END$$
DELIMITER ;