我對於Oracle的Number(*,0)
應該使用哪種數據類型有零點和任何精度有點困惑?在cfqueryparam中用於Oracle的Number(*,0)數據類型的哪個cfsqltype?
我應該使用哪一個CF_SQL_INTEGER
或CF_SQL_FLOAT
?爲什麼?
我對於Oracle的Number(*,0)
應該使用哪種數據類型有零點和任何精度有點困惑?在cfqueryparam中用於Oracle的Number(*,0)數據類型的哪個cfsqltype?
我應該使用哪一個CF_SQL_INTEGER
或CF_SQL_FLOAT
?爲什麼?
根據該文件,Number(*,0)
意味着你有非常大的整數工作,即高達38位數字,沒有小數位:
column_name NUMBER (precision, scale)
... 精度(總數位數)和規模(位數到 小數點的右邊)號:
column_name NUMBER (*, scale)
在這種情況下,精度爲38,指定的比例爲 。
這是太多的數字存儲在CF_SQL_INTEGER
。爲了支持全系列,需要具有更大容量的類型。查看標準JDBC Mappings,這意味着要麼是java.sql.Types.NUMERIC
要麼是java.sql.Types.DECIMAL
。這兩種都使用java的BigDecimal進行存儲,這對於Number(38,0)
來說具有足夠的容量。
cfqueryparam矩陣和Oracle JDBC driver文檔都對DECIMAL類型說同一件事。由於java.sql.Types.NUMERIC
實際上只是java.sql.Types.DECIMAL
的同義詞,因此您可以使用其中任何一個。
注意:使用cfqueryparam時,如果省略「scale」屬性,則默認爲scale =「0」,即無小數位。
<cfqueryparam type="CF_SQL_DECIMAL" scale="0" value="....">
如果我們對錶列有數據類型Number(*,0),但我們傳遞的是整數範圍內的值,那該怎麼辦? –
(編輯)如果這些值將總是落在32位整數範圍內,那麼您可以使用NUMERIC/DECIMAL或INTEGER。但是,如果事情發生變化,並且您嘗試傳入更大的值,那麼cfqueryparam將引發異常,並且查詢不會運行。它並沒有真正節省太多,所以我傾向於堅持任何基礎表/列類型,除非有一個非常好的理由不這樣做。 – Leigh
感謝您的清理。我正在開發一箇舊版應用程序,並且它具有爲Number數據類型編寫的CF_SQL_INTEGER和CF_SQL_FLOAT。將cfsqltype更改爲DECIMAL將會非常糟糕,但我會將其用於新的查詢。 –
我知道,無論'CF_SQL_INTEGER'和'CF_SQL_FLOAT'的作品,但老實說,我從來沒有想過推薦的兩個使用一個ORCLE號(*,0)。 – Anurag
難道你只是使用CF_SQL_NUMERIC作爲它的數字數據類型嗎? – haxtbh
@haxtbh,是的,我可以使用CF_SQL_NUMERIC。最近,我被轉移到了遺留應用程序。他們已經明確使用Number(*,0)的CF_SQL_INTEGER和Number(*,正整數)的CF_SQL_FLOAT。現在我想知道爲什麼是這樣。 –