CF_SQL_DECIMAL
和CF_SQL_NUMERIC
之间的细微差别是什么?听起来他们都接受一个名为scale
的论据({{1}})。
我在查询查询(QoQ)和MS-SQL查询中都使用它们。
答案 0 :(得分:8)
如果您想知道使用哪个cfsqltype
,则由目标列的数据类型决定。您发布的链接来自文档的旧版本。较新的包括matrix for most major databases。对于SQL Server,它列出了以下映射:
DECIMAL
列,请使用CF_SQL_DECIMAL
NUMERIC
列,请使用CF_SQL_NUMERIC
用法很简单。只需提供value
和所需的scale
:
<cfqueryparam value="#someNumber#" scale="2" cfsqltype="cf_sql_decimal">
... OR ....
<cfqueryparam value="#someNumber#" scale="2" cfsqltype="cf_sql_numeric">
关于比例的说明:
scale
默认为零(0)。意味着删除所有小数位。scale
必须是大于零的整数,显然不应超过目标列的precision
(存储的总位数)CF_SQL_DECIMAL和CF_SQL_NUMERIC之间有什么细微差别?
从CF的角度来看,它们基本相同。 CFQueryparam只是验证输入(数字,范围内等),并将value
转换为java.math.BigDecimal
对象。最后,它将SQL发送到数据库以供执行。这就是CF参与的程度。其余部分由数据库处理。因此,任何行为细微差别都可能是数据库/驱动程序特定的。
如果我要在查询中为任何一个提供整数,那会有区别吗?他们是否有不同的舍入方法?
我认为没有一个单一的答案。总的来说,大多数数据库都有类似的十进制/数字数据类型处理但是,具体细节可能因您的数据库/驱动程序而异。因此,您需要查看数据库的文档。
SQL Server的文档说"the decimal
and numeric
types are exactly equivalent to
each other。 (虽然在其他地方,他们区分说“功能”等同)。所以他们应该的行为方式相同。我对它的看法是,如果一轮,另一轮也会,溢出相同。有关详细信息,请参阅:decimal and numeric (Transact-SQL)。
默认情况下,SQL Server在将数字转换为具有较低精度和比例的小数或数值时使用舍入。但是,如果
SET ARITHABORT
选项为ON
,SQL Server在发生错误时会引发错误 发生溢出。仅精度和规模的损失是不够的 提出错误。从
int
,smallint
,...转换为decimal
或numeric
会导致溢出。
虽然在这种情况下你可能使用cfsqltype,但最好再遵循API。使用映射到目标列数据类型的cfsqltype
。
查询查询(QoQ)以及MS-SQL查询。
QoQ与数据库查询完全不同。众所周知,他们有点古怪。最好的办法是查看文档:{{3}}