在 MySQL 中处理 128 位数字

  • 本文关键字:数字 处理 MySQL mysql
  • 更新时间 :
  • 英文 :


我的表有一列,我知道它是一个 128 位无符号数字,以 10 为基数存储为 varchar,例如

"25495123833603613494099723681886"

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

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

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

  • 无法转换为 NUMERIC/DECIMAL,因为它们也是 64 位
  • 无法使用LEFT() 1<<64因为没有对齐 10 进制
  • CONV(N,10,16)允许LEFT()CONV()以 64 位精度工作太:(

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

您可以使用浮点数学至少获得部分方法。

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

FLOOR(n / POW(2,64))

其中n是列的名称。

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

最新更新