我的MySQL数据库中有一个输入列,以64个字符长的十六进制字符串结尾。
示例:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
我使用下面的SUBSTRING(input,139,64)将其取出,然后使用TRIM(LEADING '0' FROM从字符串中修剪前导零,最后使用CONV(x,16,10)将其从十六进制值转换为十进制值。
最终的select语句如下所示:
SELECT CONV(TRIM(LEADING '0' FROM SUBSTRING(input, 139, 64)), 16, 10) AS burning
FROM db
当字符串如下所示时,一切正常:80转换为十进制值:128
或者当它看起来像这样:1b8转换为正确的十进制值:440
但是,当字符串如下所示时:* * 19d971e4fe8401e74000000CONV将其转换为18446744073709551615,这是一个错误的十六进制到十进制转换。正确的返回值应为:* * 500亿美元
我做错了什么?CONV中有什么限制破坏了这个函数吗?
2条答案
按热度按时间rsaldnfx1#
来自MySQL文档:
“CONV()使用64位精度”
这意味着超过64位的值将被截断:
57hvy0tb2#
| 结果|
| - ------|
| 500亿美元|
fiddle
当然,有些CAST可能是多余的。
DECIMAL(40,0)
可能会稍微扩展。