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