十进制(2,1)的存储要求是什么?

时间:2011-12-17 08:04:31

标签: mysql data-storage

它在MySQL 5.6 manual中说:

  

DECIMAL(和NUMERIC)列的值使用二进制格式表示,该格式将九个十进制(基数为10)的数字打包成四个字节。每个值的整数和小数部分的存储是分开确定的。九位数的每个倍数需要四个字节,“剩余”数字需要四个字节的一小部分。超额数字所需的存储量由下表给出:

+----------------------------------+
|Leftover Digits | Number of Bytes |
+----------------------------------+
|       0        |        0        |
+----------------------------------+
|       1        |        1        |
+----------------------------------+
|       2        |        1        |
+----------------------------------+
|       3        |        2        |
+----------------------------------+
|       4        |        2        |
+----------------------------------+
|       5        |        3        |
+----------------------------------+
|       6        |        3        |
+----------------------------------+
|       7        |        4        |
+----------------------------------+
|       8        |        4        |
+----------------------------------+

我的问题是,如果小数点两边的数字小于9,它是否还会占用4个字节,还是会被视为“剩余”?

1 个答案:

答案 0 :(得分:0)

我使用MyISAM表进行了一些测量,通过在将一些列添加到六行数据后比较表dec.MYD的文件大小来获得答案。这是我得到的:

Original:
-rw-rw----. 1 mysql mysql   54 Dec 17 18:49 dec.MYD

Add one column of DECIMAL(2,1):
-rw-rw----. 1 mysql mysql   66 Dec 17 18:51 dec.MYD

Further add one column of DECIMAL(4,1):
-rw-rw----. 1 mysql mysql   84 Dec 17 18:51 dec.MYD

结论:

DECIMAL(2,1) requires (66-54)/6 = 2 bytes in total
DECIMAL(4,1) requires (84-66)/6 = 3 bytes in total

请注意,测试不是那么直接,因为第一列似乎总是7个字节,无论它是DECIMAL(2,1)还是INT。您需要添加更多列才能重现上述结果。