处理MySQL中的128位数字

时间:2013-10-24 06:48:50

标签: mysql

我的表中有一列,我知道它是一个128位无符号数,作为varchar存储在base-10中。

"25495123833603613494099723681886"

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

你可以使用浮点数学来获得至少部分方式。

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

FLOOR(n / POW(2,64))

其中n是列的名称。

如果需要超过50位,这种方法会耗尽蒸汽,因为即使是双精度浮点数也没有足够的有效位来表示整个事物,并且由于取消而尝试使用减法更多。 (一旦字符串转换为数字,额外的位就会丢失;如果没有做完全不同的事情,就无法将它们带回来。)