首頁>Database>source

此錯誤訊息指的是什麼資料型別?

 
ERROR:  numeric field overflow
DETAIL:  A field with precision 1, scale 0 must round to an absolute value less than 10^1.

我收到上面列出的錯誤,它来自插入觸發器.由於我的資料型別均未明確定義為 NUMERIC(1,0) 並且由於最大值是10到1的幂(即10),我猜這个錯誤實際上是指 BOOLEAN 领域.但是,我找不到對此的確认。

更新
解決了.我的觸發器正在尝試將一些字元串解析為數字. to_number()時返迴列出的錯誤 無法获得預期格式的字元串。

這將返迴1.4(正確)-

select to_number('1.4','9D9');

這將返迴上述錯誤

select to_number('1d4','9D9');

仍然不太確定為什麼抱怨 NUMERIC(1,0) 但至少我知道為什麼為什麼

最新回復
  • 6月前
    1 #

    這是因為 to_number() 从輸入字元串中除去資料字元以外的任何內容.資料字元為:數字,符號,小數點和逗號.但是,噪声字元並不是無關紧要的,因為它们仍然会影响格式模式的长度.所以:

    SELECT to_number('1d4','9D9');
    

    實際上与以下內容相同:

    SELECT to_number('14','9D9');
    

    均失败,因為模式為 '9D9' 只能在逗號​​前加一位數字。

    但是這个有效的表達式:

    SELECT to_number('1X4','99D9');  -- added digit to pattern
    

    不同:

    SELECT to_number('1XXX4','99D9');
    

    很大的噪音会截斷輸入。

    db<>在這裏拨弄

    是的, D 是格式字元串(第二个函式引數)中小數點(与語言環境無關)的格式說明符,但不包括輸入字元串(第一个函式引數)中的小數點.您已经發現自己了。


    要解決標题中的問题-Postgres在手册中有一个定義:

    Theprecisionof a numeric 是重要的总數 整數中的位數,即两者的位數 小數點的两邊. numericscale 是計數 小數部分右邊的小數位數 點.因此,數字23.5141的精度為6,小數位數為4。 整數可以认為是零。


    也就是說,我看到了 two Postgres issues 在這裏:

    1.缺少文件

    to_number()的手册中没有記錄 忽略輸入中的非資料字元.同樣,這些仍然不計入圖案的总长度。

    2.錯誤訊息中的錯誤

    錯誤訊息的DETAIL中似乎有錯誤.观察到的:

     
    DETAIL:  A field with precision 1, scale 0 must round to an absolute value less than 10^1.
    

    真的應该是:

     
    DETAIL:  A field with precision 2, scale 1 must round to an absolute value less than 10^1.
    

    效果是相同的,因此行為是连贯的.但是這些資訊具有誤匯性。

相似問題

  • postgresql:使用子查詢結果中的計數来排序父查詢結果
  • Azure SQL資料庫定價:標準層与高級層