CF_SQL_DECIMAL和CF_SQL_NUMERIC之间的细微差别

时间:2013-10-22 15:16:01

标签: sql-server coldfusion qoq

CF_SQL_DECIMALCF_SQL_NUMERIC之间的细微差别是什么?听起来他们都接受一个名为scale的论据({{1}})。

  1. 如果我要在查询中为任何一个提供整数,那会有区别吗?
    1. 如果没有,哪个更好用?
  2. 一个人更快吗?
  3. 他们有不同的舍入方法吗?
  4. 我在查询查询(QoQ)和MS-SQL查询中都使用它们。

1 个答案:

答案 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在发生错误时会引发错误   发生溢出。仅精度和规模的损失是不够的   提出错误。

  •   
  • intsmallint,...转换为decimalnumeric会导致溢出。

  •   

虽然在这种情况下你可能使用cfsqltype,但最好再遵循API。使用映射到目标列数据类型的cfsqltype

  

查询查询(QoQ)以及MS-SQL查询。

QoQ与数据库查询完全不同。众所周知,他们有点古怪。最好的办法是查看文档:{​​{3}}