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



我不确定这是否是ColdFusion 2018的错误,或者它是否是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。 如果月份是 6 月,4 个字符,则结果仍显示 9。 这就像 ColdFusion 或 Jaybird 驱动程序在字段末尾添加额外的空格,就像出于某种原因在结果中将其定义为 CHAR 类型一样。

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

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

这是ColdFusion 2018中的错误吗? Jaybird 驱动程序中的错误?任何帮助将不胜感激!

不幸的是,火鸟中的字符串文字是一个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

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

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

相关内容

  • 没有找到相关文章

最新更新