【问题标题】:Biggest possible value to store values over a million with floating points in MySQL在 MySQL 中使用浮点存储超过一百万个值的最大可能值
【发布时间】:2016-07-26 09:26:37
【问题描述】:

我正在使用 PHP 和 MySQL 开发一个 Web 应用程序,并且我试图将一个大于 100 万的值存储在一行中。每当我插入数据库时​​,假设我尝试插入 45,234,023.34(无论是什么值),它总是会被截断为 999,999.99。我为该特定列选择了一个无符号长整数。我知道这是该数据类型的最大值,根据以下link。此外,我永远不必担心超过 2 位小数。不管是什么情况,我所有的运算都将始终是 2 位小数。

你们知道怎么解决吗?在这些情况下,正确的做法是什么?

提前感谢您的宝贵时间。


更新:

这是 SQL 代码:

create table `values` (`id` int unsigned not null auto_increment primary key, `desc` text null, `concept` text null, `value` double null, `created_at` timestamp default 0 not null, `updated_at` timestamp default 0 not null) default character set utf8 collate utf8_unicode_ci

请记住,我感兴趣的列称为“价值”。谢谢!

【问题讨论】:

  • 那么您的数据库列数据类型/大小是什么?
  • 请为表添加 CREATE 语句以及用于插入这些值的代码
  • DECIMAL 数据类型似乎正是您想要的。 dev.mysql.com/doc/refman/5.7/en/…
  • @MarkBaker 添加了代码!
  • @reto 添加了代码!

标签: mysql database database-design floating-point


【解决方案1】:

不要使用FLOAT(m,n),只使用FLOAT

FLOAT 的精度只有 7 位,因此 10 位数字“45,234,023.34”会丢失最后几位:45234000

也许你想要DOUBLE

【讨论】:

  • 据我所知,任何不知道自己在做什么的人都需要 DOUBLE 或 FLOAT。
【解决方案2】:

您的查询应该是这样的:

create table `values` (`id` int unsigned not null auto_increment primary key, `desc` text null, `concept` text null, `value` DECIMAL(10,2) null, `created_at` timestamp default 0 not null, `updated_at` timestamp default 0 not null) default character set utf8 collate utf8_unicode_ci

参考链接:https://dev.mysql.com/doc/refman/5.7/en/precision-math-decimal-characteristics.html

希望这会有所帮助!

【讨论】:

    【解决方案3】:

    最后我使用了 DECIMAL(12,2)。这是因为在 ref docs 中,这将允许我有一个 10 位数的整数(小数点左侧的数字)(我只需要 9,但我会留下额外的空间,以防我决定使用负数)和小数点右侧的 2 个数字。在 PHP 中对其进行了全面测试,所有操作(只有 2 位小数,任何更大的都会被截断!)正确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多