在事务分类帐表中存储有符号或无符号值

时间:2017-03-24 21:29:39

标签: php mysql unsigned signed

想象一下交易表..

CREATE TABLE `transaction` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `type` ENUM('buy','sell') NOT NULL,
    `amount` DECIMAL(10,2) UNSIGNED NOT NULL,
    `currency` ENUM('eur','usd') NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE = InnoDB;

现在,如果我需要汇总所有条目并返回总数,我会执行以下操作

SELECT SUM(
    CASE
        WHEN `type` = 'buy' THEN `amount` ELSE -`amount`
    END) AS `total`,
    `currency`
  FROM `transaction`
GROUP BY `currency`;

现在想象一下SIGNED amount

SELECT SUM(`amount`) AS `total` FROM `transaction` GROUP BY `currency`;

似乎更简单,对吧?但不知何故感觉我错过了某些东西,事情可能会在以后变得复杂,特别是如果我需要稍后用PHP处理数据。

我非常感谢使用签名和无符号数字对利弊的任何评论。

1 个答案:

答案 0 :(得分:0)

使用无符号值最初允许您在不需要负值的情况下在同一空间中存储更大的值(大约2倍)。

根据您的情况,我会删除十进制列上的无符号,并表示它们应该是的值。如示例中那样在查询中进行数学运算会影响性能,对于大型查询可能会显着。

在没有限定符的情况下表示数据几乎总是更好,但实际上却是如此。想象一下,如果有一天你还需要添加货币转换,会对性能产生影响。

最后,根据您当前的实施情况,您将如何代表信用卡与借记卡?例如,如果销售退款,则无法存储“未售出”交易。