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

Posted

技术标签:

【中文标题】从版本 5.0.3 开始,在 mysql 表的十进制字段中存储负数【英文标题】:storing negative number in decimal field of mysql table as of version 5.0.3 【发布时间】:2011-04-15 05:16:40 【问题描述】:
    我的表中包含小数类型的金额列的字段很少。 此列将包含存款金额(正值)或提款金额(负值)。 我将正值存储为 120,将负值存储为 -50。 我对列求和,得到了预期的结果。 mysql 版本为:5.1.33-community。

    当我查看有关十进制的 mysql 文档时,我对它们的描述感到困惑。

    在 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

    当我在 phpmyadmin 中列出行时,我可以看到负号,当我计算结果时,结果符合预期。但文件说不会出现任何迹象。

    用十进制存储负数好不好(我不是在学校学过吗?困惑)?...或者我们必须使用浮点数。

    我知道浮点数不会使计算复杂化,因此建议在某些情况下坚持使用小数。

    我想对此提出建议。

【问题讨论】:

【参考方案1】:

据我了解,文档说它不会存储 literal "-" character,这意味着它现在可能正在执行其他已签名的 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 是多余的。负零和正零之间没有区别,因此负的最高有效位始终是该值那个位本身(但负面)。

【讨论】:

不错。所以它保持符号状态位明智。嗯。好的。 完全正确;有符号数 (+/-) 的正数范围是无符号数的一半,因为它的容量少了一位,而该范围的另一半是负数。 请注意——通常负数用two's complement编码,所以四位字节中的1111等于-1 谢谢@Erbureth!我应该指定我的简化示例是使用“符号幅度”方法。

以上是关于从版本 5.0.3 开始,在 mysql 表的十进制字段中存储负数的主要内容,如果未能解决你的问题,请参考以下文章

将十进制数存储到 MySQL 数据库中

从 PowerBI 表的列中删除“%”符号

如何让mysql的自动递增的字段重新从1开始

MySQL存储引擎MyISAM与InnoDB区别

从mysql中检索十进制数据并放入数组

存储引擎,MySQL中的数据类型及约束