2013-12-21 69 views
0

我的应用程序需要处理高达10^45的正数。 我有一个表统计:somenumber BIGINT 在这个表,我有以下内容:“somenumber = 775488948283” 我希望MySQL返回我775488948283000000000000000000000000000.MySQL计算大数BIGINT绕过

我试图

SELECT 
    (

    SELECT somenumber FROM stats LIMIT 1 

    )*1000000000000000000000000000 as bignumber; 

但我得到了一个MySQL错误:错误1690(22003):BIGINT值超出范围....

我不明白,当我做一个双选择我不在统计表中,所以MySQL为什么告诉我它太大了,我怎么才能让MySQL把这个数字乘以10000 00000000000000000000000并给我结果?

回答

0

为BIGINT的最大值为:

9,223,372,036,854,775,807 
+0

我知道,但我想让MySQL返回数字* 1000000000000000000000,我不要求它在数据库中插入,所以我不明白为什么我受限于BIGINT最大值。 MySQL无法给出大于BIGINT最大值的输出数字? – user3124040

+1

正确。 '*'(乘)是算术运算符。对于BIGINT,它是在运行MySQL服务器的机器上使用64位寄存器实现的。任意精度算术类以各种语言存在,但没有一个是内置于MySQL中的。你可以将你的号码转换成一个字符串,并将其前置到一堆零。 –

+1

@OllieJones更准确地说不是一个字符串,而是一个'varchar' – deW1

0

当结果值超过MAX无符号范围值,你不能直接处理它在整个数字。相反,您必须通过使用cast对结果值使用type promotion方法。

以下应该工作。

SELECT 
    CAST( 
    (SELECT my_big_int_num FROM STATS LIMIT 1) AS DECIMAL 
    ) * 1000000000000000000000000000 as big_big_number 

参考MySQL: Out-of-Range and Overflow Handling

0

如果你运行:

SELECT 775488948283*1000000000000000000000000000 as bignumber; 

你会得到正确的答案,但表示为浮点数(指数形式)。

如果你运行:

SELECT cast(775488948283*1000000000000000000000000000 as char(255)) as bignumber; 

你会得到你想要的输出。

您还可以将值转换为字符串,然后追加零:

select concat(cast(775488948283 as char(255)), 
       '000000000000000000000000000' 
      ) 

我会使用最后一种。使用浮点数字时,您总是会冒最低数字可能变成别的东西的风险 - 精度不足以存储45位数字。

在数据库中,您可能希望将编号存储为decimal(65, 0)以最好地表示您的数据。