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

标签 coldfusion firebird firebird2.5 jaybird

我不确定这是 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

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



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

关于coldfusion - Firebird Jaybird 2.2.10/ColdFusion 2018 - 字符串长度错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58208969/

相关文章:

android - JSON/CFML - 遍历结构数组

php - 人工输入的智能日期范围解析?

sql - 所有值也是选项时的 Delphi 查询参数用法

stored-procedures - 错误 -104 创建 Firebird 存储过程的命令意外结束

sql - 我可以在 Where 子句中使用 Firebird DateAdd 函数吗?

firebird - 从字符串列中提取整数值和附加文本

coldfusion - 设置邮件服务器参数时发生异常。 : cfpop

javascript - 将值传递给模态窗口中的 JavaScript 函数

doctrine-orm - 有没有办法在 Zend Framework 2 中将 Firebird/Ibase 与 Doctrine 一起使用?

hibernate - 如何使用 Hibernate Annotations 将 Firebird Smallint 映射到 bool 值?