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

Jay*_*ran 4 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. 我知道浮动会使计算变得复杂,并建议在某些条件下坚持使用小数.

    我想对此提出建议.

Jef*_*den 8

根据我的理解,文档说它不会存储文字 " - " 字符,这意味着它现在可能正在执行其他已签名的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.负零和正零之间没有区别,所以负最高有效位始终是值那个位本身(但是否定的).

  • 究竟; 并且带符号的数字(+/-)具有无符号数的正范围的一半,因为它具有少一位的容量,并且该范围的另一半是负的. (2认同)
  • 只是一个注释 - 通常负数用[二进制补码]编码(http://en.wikipedia.org/wiki/Two's_complement),所以四位字节的'1111`等于`-1` (2认同)