【问题标题】:Dealing with 128-bit numbers in MySQL在 MySQL 中处理 128 位数字
【发布时间】:2013-10-24 15:11:47
【问题描述】:

我的表有一个列,我知道它是一个 128 位无符号数,以 varchar 形式存储在 base-10 中,例如

"25495123833603613494099723681886"

我知道这个数字中的位域,我想使用GROUP BY 中的前 64 位。

在我的示例中,前 64 位为 1382093432409

我还没有找到方法,但我已经消除了一些线索:

  • 无法转换为 NUMERIC/DECIMAL,因为它们也是 64 位的
  • 无法使用 LEFT(),因为 1<<64 不是以 10 为基数对齐的
  • CONV(N,10,16) 将允许 LEFT()CONV() 也只能在 64 位精度下工作:(

我怎样才能得到这个数字的前 64 位 BIGINT,所以我可以在 GROUP BY 中使用它?

【问题讨论】:

  • 不存储它们以 10 为基数,而是以 16 为基数——这意味着 varchar 中的十六进制值如何?那么获得前 64 位将非常容易——将是前四个字符。 (假设您使用 8 个字符的固定长度存储它们,必要时补零。)
  • @CBroe 不幸的是,数据已经在表格中,我只想报告它。我无法更改架构,也无法更改生成数据的代码。它是一个遗留系统。
  • 用新的十六进制列创建视图? idk 关于性能然后..
  • @Sebas 但这又导致了如何做到这一点的问题......
  • 对,HEX() 也仅限于其输入...您可以创建自己的 HEX 存储过程,将字符串拆分为 n 个部分以独立处理这些部分。

标签: mysql


【解决方案1】:

您可以使用浮点数学至少获得其中的一部分。

MySQL 对非整数数学使用双精度浮点数。这为您提供了大约 50 位的整数值的可靠精度 - 虽然这不是 64,但它非常接近。您可以使用浮点数学在此处使用表达式提取最高位:

FLOOR(n / POW(2,64))

其中n 是列的名称。

但是,如果需要超过 50 位,这种方法就会失去动力,因为即使是双精度浮点数也没有足够的有效位来表示整个事物,并且由于取消而尝试使用减法来获取更多信息会失败. (一旦将字符串转换为数字,多余的位就会丢失;如果不做完全不同的事情,它们就无法恢复。)

【讨论】:

  • (啊,我刚刚为我的示例输入了一长串十进制数字;我将添加更多。我不知道如何让我的字符串首先成为浮点数不过?)
  • 您不必这样做。当您在其上使用浮点运算符时,MySQL 会将其隐式解释为浮点值 - 就像将其除以 POW() 的结果一样。
  • 那么MySQL在进行除法之前将字符串转换成什么数据类型呢?
  • 不,它是 64 位类型 - 但浮点数的全部目的是其中一些位(其中 11 个,在 64 位浮点数中)专用于表示数字的比例,因此它可以表示远在类似大小的整数范围之外的数字。
猜你喜欢
  • 2013-11-07
  • 2021-12-04
  • 2011-05-25
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多