我不确定这是否是ColdFusion 2018错误,或者这是否是ColdFusion 2018实现Firebird 2.5的Jaybird 2.2.10驱动程序的方式。
我有一个表,其中包含一个名为“ item_date”的列。此列具有Firebird“日期”数据类型。在ColdFusion 10中,以下查询根据返回的月份显示正确的字符串长度。但是,在ColdFusion 2018中,所有字符串的长度返回为9。几乎就像ColdFusion将结果集分配为CHAR(9)数据类型,而不是应有的VARCHAR。
我的概念证明代码示例如下。
<cfquery name="test" datasource="#application.dsn#">
SELECT
CASE EXTRACT (MONTH from item_date)
WHEN 1 THEN 'January'
WHEN 2 THEN 'February'
WHEN 3 THEN 'March'
WHEN 4 THEN 'April'
WHEN 5 THEN 'May'
WHEN 6 THEN 'June'
WHEN 7 THEN 'July'
WHEN 8 THEN 'August'
WHEN 9 THEN 'September'
WHEN 10 THEN 'October'
WHEN 11 THEN 'November'
WHEN 12 THEN 'December'
END itemMonth
FROM MY_TABLE
</cfquery>
<cfloop query="test">
#test.itemMonth# - Length: #Len(test.itemMonth)#<br />
</cfloop>
运行时,期望结果显示出来
[9月-长度:8月9日-长度:6 ..依此类推。
但是,显示的全部长度为9。如果月份是4个字符的6月,则结果仍显示9。这就像ColdFusion或Jaybird驱动程序在字段末尾添加了额外的空格,就像出于某种原因在结果中将其定义为CHAR类型。
使用相同的Firebird 2.5和Jaybird 2.2.10驱动程序在ColdFusion 10上不会发生。[在使用SQL Server代替Firebird的ColdFusion 2018中也不会发生这种情况
这是一个相当大的问题,因为当检查等于“ string”的结果时,它导致字符串比较失败。例如,如果我拉查询查询以查找itemMonth ='October'的位置,则不会返回任何结果,因为结果的'October'带有2个额外的空格。
这是ColdFusion 2018中的错误吗? Jaybird驱动程序中的错误?非常感谢您的帮助!
不幸的是,Firebird中的字符串文字是-CHAR
,而不是VARCHAR
。类型CHAR
的值用空格填充,直到声明的长度为止。在CASE
中使用字符串文字时,结果数据类型将具有最长文字的长度,即September
,因此结果的类型为CHAR(9)
,较短的值都将用空格填充。最长为9。
我不知道ColdFusion,但是看起来ColdFusion 10会自动修剪值,并且不再在ColdFusion 2018中执行此操作。您将需要手动修剪-在您的ColdFusion代码或查询中-以达到所需的效果,或寻找可控制此行为的设置。
[顺便说一句,Jaybird 2.2.10(2016年3月)不是最新的2.2,即Jaybird 2.2.15(2019年4月)。 Jaybird 2.2已停产,将不会再有更新。目前,Jaybird的总体最新版本为3.0.6(2019年5月)。
[ColdFusion中的修复程序,最初由Phil添加到问题中的是:
对于任何希望此功能一如既往地工作的人,在ColdFusion自动修剪尾随空格,可以使用下面的JVM参数。
-Dcoldfusion.trim.dbresult=true
根据该链接,默认情况下行为在ColdFusion 11中更改为不再修剪,并且此属性在ColdFusion 11 Update 7中引入以启用旧的行为。