我的表有一个列,我知道它是一个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中使用它?
最佳答案 您可以使用浮点数学至少获得部分方式.
MySQL使用双精度浮点进行非整数数学运算.这为积分值提供了大约50位可靠的精度 – 虽然这不是64,但它非常接近.您可以使用浮点数学来使用表达式提取顶部位:
FLOOR(n / POW(2,64))
其中n是列的名称.
如果需要超过50位,这种方法就会耗尽蒸汽,因为即使是双精度浮点数也没有足够的有效位来表示整个事物,并且由于取消而尝试使用减法进行更多操作失败. (一旦字符串转换为数字,额外的位就会丢失;如果不做完全不同的事情,它们就无法恢复.)