DECIMAL mysql和存储空间?

问题描述 投票:0回答:3

根据我对 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 decimal
3个回答
5
投票

对于MySQL 5.1(及更高版本),它将整数部分和小数部分的存储分开,并为最大可能的数字腾出存储空间。因此,对于 DECIMAL(12,6),整数部分需要 3 个字节,小数部分需要 3 个字节。看起来它并没有根据值减少存储;无论值是多少,它都会将内存放在一边。

您可以在此处查看文档:

MySQL 十进制手册页


2
投票
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


0
投票

可以用这个函数计算:

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 ;

来源

© www.soinside.com 2019 - 2024. All rights reserved.