4

根据我对 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

所以 adecimal(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 如何检索或索引列吗?

4

2 回答 2

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

于 2014-09-12T13:48:22.393 回答
3

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

您可以在此处查看文档:

MySQL 十进制手册页

于 2012-06-13T00:13:44.950 回答