【问题标题】:MySql IEEE floating point NaN, PositiveInfinity, NegativeInfinityMySql IEEE 浮点 NaN、PositiveInfinity、NegativeInfinity
【发布时间】:2017-06-15 15:21:03
【问题描述】:

我已经查看了很多关于这个问题的问题,但我还没有找到解决方案。希望这不是一个重复的问题。

问题

如果我这样做:

INSERT INTO `Numbers`(`Number`) VALUES ('NaN')
INSERT INTO `Numbers`(`Number`) VALUES ('Inf')
INSERT INTO `Numbers`(`Number`) VALUES ('+Inf')

我在表格中插入了 0.0。有时我会得到:

Error Code: 1265. Data truncated for column 'Number'

我也尝试了不同的大小写和拼写,效果都一样。

我什至尝试过:

INSERT INTO `Numbers`(`Number`) VALUES ('1111111111111000000000000000000000000000000000000000000000000000')

如何在 MySql 表中插入 NaN 浮点数?

如果真的不可能,那么原因是什么? (可能是我使用的 MySql 版本不对?)

使用 NULL 作为 NaN

我实际使用它的表我不想在这些列中允许 NULL 值。所以我不喜欢在 ORM 层的某处用 NULL 替换 NaN 的想法

【问题讨论】:

  • 您很可能不会收到错误消息,因为您的会话配置了旧版 SQL_MODE。而且,抱歉,您只能存储有限的数字。
  • 好的。你知道为什么会这样吗?我假设 MySql 团队并没有忘记它。他们一定是出于某种原因做出了选择?
  • 引用Raymond Chen“为什么不存在此功能?”的答案通常是“默认情况下功能不存在。必须有人实施它们。”并不是你能想到的每一个特性都是从你的大脑中经过全面测试和实现的,然后某个地方的一些 PM 提交了一个错误来删除你的特性。功能一开始是不存在的,必须有人来实现它们。

标签: mysql nan ieee-754 infinity


【解决方案1】:

要全面了解 MySQL 如何处理数字,您可以阅读以下章节:

上一篇文章提到了这一点:

服务器包含dtoa,这是一个转换库,提供 改进字符串或DECIMAL 值之间转换的基础和 近似值 (FLOAT/DOUBLE) 数字

[...]

dtoa 库提供具有以下属性的转换。 D 表示具有DECIMAL 或字符串表示的值,以及F 表示本机二进制 (IEEE) 格式的浮点数。

[...]

除非F-inf+infNaN,否则转换是无损的。后者 不支持值,因为 SQL 标准将它们定义为 FLOATDOUBLE 的值无效。

简而言之:

  • SQL 标准明确禁止这些值
  • MySQL 在这方面符合标准

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 2012-03-09
    • 2012-01-06
    • 2014-10-18
    • 2020-06-09
    • 1970-01-01
    相关资源
    最近更新 更多