2013-12-21 44 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)以最好地表示您的數據。