mysql和存储空间?

oyxsuwqo  于 12个月前  发布在  Mysql
关注(0)|答案(3)|浏览(143)

根据我对mysql文档中DECIMAL手册的理解,它指出,9位数的每一个倍数需要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?


或者如果声明为(12,6),它总是6个字节吗?

已编辑

同样,一个声明为(5,5)的十进制数需要存储6个字节,而一个声明为(12,6)的十进制数也需要存储6个字节。既然存储大小不是问题,那么大小的差异会影响mysql如何检索或索引列吗?

vbopmzt1

vbopmzt11#

对于MySQL 5.1(及更高版本),它将整数部分和小数部分的存储空间分开,并为最大可能的数字腾出空间。因此,对于DECIMAL(12,6),您需要3个字节用于整数部分,3个字节用于小数部分。它看起来并不像是根据值减少存储空间;它将内存放在一边,不管值是什么。
你可以在这里查看文档:
MySQL Decimal Manual Page

mm9b1k5b

mm9b1k5b2#

DECIMAL(12,6)

字符串
一曰:178.999999 //整数部分有3位数,因此总数为5个字节(正确)2:0.880000 //整数部分有1位数,因此总数为4个字节?(错误)3 123456.123456 // 6位数等于6个字节?(正确)
说明:剩余数字个数为100 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

bbuxkriu

bbuxkriu3#

可以用这个函数计算:

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 ;

字符串
source
要创建某些值的列表,请使用:用途:

select m, d, fn_DECIMAL_SIZE(m,d)
from (
    (select seq as m from seq_1_to_20) _m
    join
    (select seq as d from seq_0_to_6) _d
)
where m>=d;

相关问题