MySQL十进制内存使用情况(签名v无符号)

时间:2015-09-28 19:11:33

标签: mysql decimal

我理解MySQL十进制数的内存存储要求(例如DECIMAL(5,2)需要2个字节用于3个整数,1个用于小数。但我注意到十进制也可以是有符号或无符号的。

对于TINYINT等数字,范围取决于是否有符号(-128到127)或无符号(0-255)。那么我的问题是,如果有符号或无符号,小数的内存使用量是否会改变? -999.99到999.99会使用与000.00到999.99相同的内存吗?

2 个答案:

答案 0 :(得分:6)

  

-999.99到999.99会使用与000.00到999.99相同的内存吗?

简短回答:是的。

更长的答案:

  • 小数点左边的数字和右边的数字都被认为是整数。
  • 左边的那些有一个标志,但它不占用任何额外的空间。
  • 9位数的每个组(左侧或右侧)适合4个字节;小于9占用ceil(N / 2)字节。

一个简单的经验法则:" DECIMAL(m,n)需要m/2个字节。"它并不总是准确的,但它非常接近。

我认为DECIMAL的最后一个重大变化是5.0.5。

答案 1 :(得分:3)

这将从版本更改为版本。以下是有关如何在5.6中实施的信息。

The MySQL docs不要谈论标牌的影响,并建议深入了解decimal2bin()的来源了解详情。那里有关于存储格式的重要评论。

This binary format is as follows:
  1. First the number is converted to have a requested precision and scale.
  2. Every full DIG_PER_DEC1 digits of intg part are stored in 4 bytes
     as is
  3. The first intg % DIG_PER_DEC1 digits are stored in the reduced
     number of bytes (enough bytes to store this number of digits -
     see dig2bytes)
  4. same for frac - full decimal_digit_t's are stored as is,
     the last frac % DIG_PER_DEC1 digits - in the reduced number of bytes.
  5. If the number is negative - every byte is inversed.
  5. The very first bit of the resulting byte array is inverted (because
     memcmp compares unsigned bytes, see property 2 above)

关键是" 5。如果数字为负数 - 每个字节都被反转。",那么答案是有符号或无符号对DECIMAL存储大小没有影响。