Firebird Jaybird 2.2.10 / ColdFusion 2018 - 字符串长度错误

Firebird Jaybird 2.2.10 / ColdFusion 2018 - String Length Bug

我不确定这是 ColdFusion 2018 的错误,还是 ColdFusion 2018 为 Firebird 2.5 实施 Jaybird 2.2.10 驱动程序的方式。

我有一个 table,其中包含一个名为 "item_date" 的列。此列具有 Firebird "date" 数据类型。在 ColdFusion 10 中,下面的查询显示了基于月份 returned 的正确字符串长度。但是,在 ColdFusion 2018 中,所有字符串的长度 returning 都为 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>

运行时,结果会显示

September - Length: 9
August - Length: 6
..and so on.

然而,它显示的是所有的长度都是 9。如果月份是 June,4 个字符,结果仍然显示 9。这就像 ColdFusion 或 Jaybird 驱动程序在字段末尾添加了额外的空格,就像由于某种原因在结果中将其定义为 CHAR 类型一样。

使用相同的 Firebird 2.5 和 Jaybird 2.2.10 驱动程序的 ColdFusion 10 不会发生这种情况。
当使用 SQL Server 而不是 Firebird

时,这在 ColdFusion 2018 中也不会发生

这是一个很大的问题,因为在检查等于 "string" 的结果时,它会导致字符串比较失败。例如,如果我提取查询查询查找 itemMonth = 'October' 的位置,则不会有结果 return,因为结果有 'October ' 和 2 个额外的空格。

这是 ColdFusion 2018 中的错误吗? Jaybird 驱动程序中的错误?非常感谢任何帮助!

不幸的是,Firebird 中的字符串文字是 CHAR,而不是 VARCHARCHAR 类型的值用空格填充到声明的长度。当在 CASE 中使用字符串文字时,生成的数据类型将具有最长文字的长度,即 September,因此结果的类型是 CHAR(9),而较短的值将全部用长度不超过 9 的空格填充。

我不知道 ColdFusion,但看起来 ColdFusion 10 会自动 trimmed 值,并且在 ColdFusion 2018 中不再这样做。您将需要手动 trim - 在您的 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 修复

ColdFusion 中的修复,最初由 Phil 添加到问题中的是:

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

根据 link,ColdFusion 11 中的行为已更改为默认不再 trim,并且此 属性 是在 ColdFusion 11 Update 7 中引入的,以启用旧的行为。