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