3

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

"25495123833603613494099723681886"

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

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

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

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

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

4

1 回答 1

2

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

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

FLOOR(n / POW(2,64))

n列的名称在哪里。

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

于 2013-10-24T07:05:56.923 回答