从版本5.0.3开始,在mysql表的十进制字段中存储负数

时间:2010-09-21 13:35:18

标签: mysql types

  1. 我的表格中包含少量类型为decimal的字段。
  2. 此栏将有存款金额(正值)或提款金额(负值)。
  3. 我将正值存储为120,将负值存储为-50。
  4. 我对列进行求和,得到了预期的结果。
  5. Mysql版本是:5.1.33-community。
  6. 当我查看关于十进制的mysql文档时,我与他们的描述混淆了。

  7.   

    在MySQL 5.0.3之前,如果你插入了   +0003.1进入DECIMAL(5,1)列,它存储为+0003.1。截至MySQL    5.0.3 ,存储为3.1。对于负数,一个字面 -   字符不再存储。   依赖于旧版本的应用程序   行为必须修改为帐户   为了这个改变。 http://dev.mysql.com/doc/refman/5.0/en/precision-math-decimal-changes.html

  8. 当我在phpmyadmin中列出行时,我可以看到负号,当我计算出结果时,正如预期的那样。但文件说没有出现任何迹象。

  9. 以十进制存储负数是不是很好(我没有在学校学过?迷茫)?...或者我们必须使用浮点数。

  10. 我知道浮动会使计算变得复杂,并建议在某些条件下坚持使用小数。

    我想就此提出建议。

1 个答案:

答案 0 :(得分:7)

根据我的理解,文档说它不会存储文字“ - ”字符,这意味着它现在可能正在执行其他签名的INTEGER字段总是这样做,它存储一个符号位来表示负数。

你仍然在数字前面看到一个减号,因为它是由于该符号位而由MySQL生成的。

如果你不理解符号位,可以考虑一个有符号字节如何存储-128到127之间的数字,而无符号字节可以存储0到255之间的数字。这是因为一个8位中的一个有符号数用于存储+/-(1为负数,0为正数),而其余位提供最多2 ^ 7(-128或127)的数字。

因此,例如,如果位1111具有符号位,则它们将等于-7(负+ 4 + 2 + 1),但如果它们是无符号的,则它们等于15(8 + 4 + 2 + 1) 。它仍然存储的位数相同。

您可能想知道为什么带符号数的负边界可以使用第8位,而正边界限制为7位的总和(比第8位少1)。这是因为10000000同时被认为是负数和第8位,因为它的表示-0否则是00000000的冗余,表示0。负零和正零之间没有区别,所以负最高有效位始终是值那个位本身(但是否定)。