Firebird Jaybird 2.2.10 / ColdFusion 2018 - 字符串长度漏洞

5

我不确定这是ColdFusion 2018的一个bug,还是ColdFusion 2018实现Firebird 2.5的Jaybird 2.2.10驱动程序时的某些问题。

我有一个包含名为"item_date"的列的表。该列具有Firebird的"date"数据类型。在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
八月 - 长度:6
...等等。

然而,它实际上显示的是所有月份都是长度为9。如果月份是六月,四个字符,则结果仍然显示为9。这就像ColdFusion或Jaybird驱动器在字段末尾添加额外的空格,就好像由于某种原因在结果中将其定义为CHAR类型一样。 使用相同的Firebird 2.5和Jaybird 2.2.10驱动程序,在ColdFusion 10上不会发生这种情况。 当使用SQL Server而非Firebird时,在ColdFusion 2018中也不会发生这种情况。 这是一个很大的问题,因为这会导致字符串比较失败,当检查等于“字符串”的结果时。例如,如果我提取查询的查询,寻找itemMonth ='October'的结果将不返回,因为结果有'October ',带有2个额外的空格。
这是ColdFusion 2018中的一个错误吗?Jaybird驱动程序的一个bug?非常感谢任何帮助!

就我所知,我可以确认它在我的ColdFusion 2018服务器上按预期工作。 - TRose
只是出于好奇,当您尝试对字符串进行 trim() 时会发生什么? - James A Mohler
1
@JamesAMohler 可能会!至少在Firebird 2.1.7中,调用Trim函数会将CHAR转换为VARCHAR。相反,没有Trim的类型转换是不行的 - 这个查询返回9而不是7:select Char_length( Cast( DECODE( EXTRACT (MONTH from current_date), 8, 'August', 9, 'September', 10, 'October') as Varchar(20) )) from rdb$database - Arioch 'The
@MarkRotteveel,不,那很完美,请继续。你的答案引导我找到了解决方案,所以我不想取消你的采纳。请将我的补充也加入到你的答案中。 - Phil
@Phil 谢谢,我已经做出了这些更改。 - Mark Rotteveel
显示剩余4条评论
1个回答

7
在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修复方法为:

To anyone who wants this to work as it always has, where ColdFusion trims the trailing spaces automatically, that is possible using the JVM argument below.

-Dcoldfusion.trim.dbresult=true

https://tracker.adobe.com/#/view/CF-4100830

根据该链接,ColdFusion 11中的行为已更改为不再默认修剪,并且在ColdFusion 11 Update 7中引入了此属性以启用旧行为。

Rottevell - 感谢您的帮助!这解释了一切。 - Phil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接