是的,确实有区别——但不是你想的那样。
不是那样的NULL
本身有一种数据类型,其中一个是联系使用它(隐式或显式)作为评估 SQL 的一部分。对于上面的 SELECT 语句,数据类型适用于列元数据。没有明确的CAST
, the 数据类型默认为 INT https://stackoverflow.com/questions/15647580/does-null-have-a-data-type.
采取这个查询:
<cfquery name="qTest" datasource="#variables.sqlServerDSN#">
SELECT NULL AS NonSpecifiedNull
, CAST(NULL AS datetime) AS DateTimeNull
, CAST(NULL AS varchar(25)) AS VarcharNull
</cfquery>
<cfdump var="#getMetaData(qTest)#" label="Query MetaData">
如果您检查查询元数据,查询包含具有三种不同数据类型的列:integer
, datetime
and varchar
:
从 ColdFusion 的角度来看,数据类型会影响在各种函数、比较、QoQ 甚至修改查询对象本身时如何解释列值。例如,使用日期时间对象更新三列中的每一列:
<cfset dateTimeNow = now()>
<cfset qTest.NonSpecifiedNull[1] = dateTimeNow>
<cfset qTest.DateTimeNull[1] = dateTimeNow>
<cfset qTest.VarcharNull[1] = dateTimeNow>
<cfdump var="#qTest#" label="Query Values">
结果将会非常不同。插入“DateTimeNull”的值仍然是日期对象。但是,相同的值在插入“VarcharNull”时将转换为字符串,在插入“NonSpecifiedNull”时将转换为整数。后两者几乎可以肯定not您期望或希望如何处理日期对象。这就是为什么最好包括适当的CAST
在原始 SQL 查询中。
诚然,ColdFusion 非常宽容,并且相对无类型。因此,将日期对象存储为字符串或整数可能并不总是会导致硬错误。然而,它确实强制进行隐式转换,这在最好的情况下是不必要的,在最坏的情况下容易出错和/或可能产生错误的结果。例如,如果您将原始日期与“NonSpecifiedNull”列进行比较,您可能会期望它们相等,但是..由于数据类型的原因,它们不是相等的:
dateCompare(dateTimeNow, qTest.NonSpecifiedNull[1]) eq 0 ? "EQUAL" : "DIFFERENT"
所以再次强调,最好CAST
预先输入正确的类型以确保预期的结果。