我理解MySQL十进制数的内存存储要求(例如DECIMAL(5,2)需要2个字节用于3个整数,1个用于小数。但我注意到十进制也可以是有符号或无符号的。
对于TINYINT等数字,范围取决于是否有符号(-128到127)或无符号(0-255)。那么我的问题是,如果有符号或无符号,小数的内存使用量是否会改变? -999.99到999.99会使用与000.00到999.99相同的内存吗?
答案 0 :(得分:6)
-999.99到999.99会使用与000.00到999.99相同的内存吗?
简短回答:是的。
更长的答案:
一个简单的经验法则:" 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
存储大小没有影响。