6

CF_SQL_DECIMAL和之间的细微差别是什么CF_SQL_NUMERIC?听起来他们都接受一个名为scale(根据http://csis.pace.edu/~ctappert/cs615-02/support/Help/CFML_Language_Reference/lang_0277.htm)的论点。

  1. 如果我要为查询中的任何一个提供一个整数,会有区别吗?
    1. 如果没有,哪个更好用?
  2. 一个更快吗?
  3. 他们有不同的舍入方法吗?

我在查询 (QoQ) 和 MS-SQL 查询中都使用了这些。

4

1 回答 1

13

如果您想知道cfsqltype使用哪个,它由目标列的数据类型决定。您发布的链接来自文档的非常旧版本。较新的包括大多数主要数据库的矩阵。对于 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 只是验证输入(数字、范围内等),并将其转换valuejava.math.BigDecimal对象。最后,它将 SQL 发送到数据库执行。这就是CF的参与程度。其余的由数据库处理。因此,任何行为细微差别都可能是特定于数据库/驱动程序的。

如果我要为查询中的任何一个提供一个整数,会有区别吗?他们有不同的舍入方法吗?

我认为没有一个全面的答案。总体而言,大多数数据库对十进制/数字数据类型的处理方式相似。但是,确切的详细信息可能会因您的数据库/驱动程序而异。因此,您需要查看数据库的文档。

SQL Server 的文档说decimalnumeric类型彼此完全等价。(尽管在其他地方他们区分说“功能上”等价)。所以它们的行为方式应该相同。我的看法是,如果一轮,另一轮也一样,溢出也一样。有关更多详细信息,请参阅:十进制和数字(Transact-SQL)

  • 默认情况下,SQL Server 在将数字转换为精度和小数位数较低的小数或数值时使用舍入。但是,如果SET ARITHABORT选项是ON,则 SQL Server 会在发生溢出时引发错误。仅损失精度和规模不足以引发错误。

  • int, smallint, ... 转换为decimalornumeric会导致溢出。

虽然在这种情况下您可能可以使用任一 cfsqltype,但最好还是遵循 API。使用cfsqltypewhich 映射到目标列的数据类型。

在查询的查询 (QoQ) 以及 MS-SQL 查询中。

QoQ 与数据库查询完全不同。众所周知,它们有时有点……古怪。最好的办法是查看文档:Query of Queries user guide

于 2013-10-24T13:50:12.763 回答