我对于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。现在我想知道为什么是这样。 –