我不确定这是否是一个ColdFusion 2018年的错误,或者它是否是ColdFusion 2018年实现火鸟2.2.10驱动程序的方式。
我有一个表,其中包含一个名为"item_date“的列。该列具有Firebird "date“数据类型。在ColdFusion 10中,下面的查询根据返回的月份显示正确的字符串长度。然而,在2018年的ColdFusion中,字符串长度返回为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月-长度:9
8月-长度:6
..and等。
然而,它所显示的却是它们的长度为9。如果月份是6月,4个字符,结果仍然显示9个字符。就像ColdFusion或者Jaybird驱动程序在字段末尾添加额外的空格一样,就像结果中由于某种原因将其定义为CHAR类型一样。
使用相同的Firebird 2.5和Jaybird2.2.10驱动程序在ColdFusion 10上没有发生这种情况。
在使用Server而不是Firebird时也不会在ColdFusion 2018中发生这种情况
这是一个相当大的问题,因为在检查等于" string“的结果时,它会导致字符串比较失败。例如,如果我查询查询的位置,itemMonth =‘十月’不会返回任何结果,因为结果有两个额外的空格。
这是ColdFusion 2018年的一个bug吗?Jaybird司机身上的窃听器?任何帮助都是非常感谢的!
发布于 2019-10-03 05:52:51
不幸的是,火鸟中的字符串是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是寿命的终结,不会收到更多的更新。目前最新的知更鸟总数为3.0.6 (2019年5月)。
ColdFusion修正
ColdFusion中的修正(最初由Phil添加到问题中)是:
对于任何希望这样做的人来说,
都可以像往常一样工作,在这里,ColdFusion自动裁剪尾随空间,这可以使用下面的JVM参数。
-Dcoldfusion.trim.dbresult=true
https://tracker.adobe.com/#/view/CF-4100830
根据该链接,默认情况下,ColdFusion 11中的行为已更改为不再修剪,并且在ColdFusion 11更新7中引入了此属性以启用旧行为。
https://stackoverflow.com/questions/58208969
复制相似问题