我不确定这是 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>
当它运行时,人们会期望结果显示
September - Length: 9
August - Length: 6
..and so on.
但是,它显示的是所有这些的长度为 9。如果月份是六月,4 个字符,结果仍然显示 9。这就像 ColdFusion 或 Jaybird 驱动程序在字段的末尾添加了额外的空格,就像出于某种原因在结果中将其定义为 CHAR 类型。
在使用相同 Firebird 2.5 和 Jaybird 2.2.10 驱动程序的 ColdFusion 10 上不会发生这种情况。
当使用 SQL Server 而不是 Firebird 时,这在 ColdFusion 2018 中也不会发生。
这是一个相当大的问题,因为在检查等于“string”的结果时,它会导致字符串比较失败。例如,如果我拉查询查询 where 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 修复
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
根据该链接,ColdFusion 11 中的行为已更改为默认不再修剪,并且在 ColdFusion 11 Update 7 中引入了此属性以启用旧行为。
关于coldfusion - Firebird Jaybird 2.2.10/ColdFusion 2018 - 字符串长度错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58208969/