Firebird Jaybird 2.2.10 / ColdFusion 2018 - ошибка длины строки - PullRequest
5 голосов
/ 02 октября 2019

Я не уверен, что это ошибка ColdFusion 2018 или что-то вроде того, как ColdFusion 2018 реализует драйвер Jaybird 2.2.10 для Firebird 2.5.

У меня есть таблица, которая содержитстолбец с именем "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>

Когдаэто работает, можно ожидать, что результат покажет

сентябрь - длина: 9Август - длина: 6... и так далее.

Однако вместо этого для всех из них показана длина 9. Если месяц июнь, 4 символа, результат по-прежнему показывает 9. Это похоже на ColdFusion или драйвер Jaybird добавляет дополнительный пробел в конец поля, как будто он определен в результате как тип CHAR по какой-то причине.

Этого не происходит в ColdFusion 10 с использованием того же Firebird 2.5 и драйвера Jaybird 2.2.10.
Этого также не происходит в ColdFusion 2018 при использовании SQL Server вместо Firebird

Это довольно проблематично, потому что это приводит к сбою сравнения строк при проверке результатов, которые равны «строке». Например, если я потяну Query of Queries, ища где itemMonth = 'October', результаты не вернутся, потому что у результата 'October' с 2 дополнительными пробелами.

Является ли это ошибкой в ​​ColdFusion 2018? Ошибка в драйвере Jaybird? Любая помощь с благодарностью!

1 Ответ

7 голосов
/ 03 октября 2019

Строковый литерал в Firebird - это, к сожалению, CHAR, а не VARCHAR. Значения типа CHAR дополняются пробелами до заявленной длины. При использовании строковых литералов в CASE результирующий тип данных будет иметь длину самого длинного литерала, равную September, поэтому тип результата равен CHAR(9), и все более короткие значения будут дополнены пробелами. до длины 9.

Я не знаю ColdFusion, но похоже, что ColdFusion 10 автоматически обрезает значения и больше не делает этого в ColdFusion 2018. Вам нужно будет обрезать вручную - в коде ColdFusion илив вашем запросе - для достижения желаемого эффекта или найдите параметр, который управляет этим поведением.

Кроме того, Jaybird 2.2.10 (март 2016 г.) - не самая последняя версия 2.2, то есть Jaybird 2.2. 15 (апрель 2019 г.)Jaybird 2.2 окончен и больше не будет получать обновлений. Общая последняя версия Jaybird на данный момент - 3.0.6 (май 2019 г.).

Исправление ColdFusion

Исправление в ColdFusion, первоначально добавленное к вопросу Фил ::

Для тех, кто хочет, чтобы это работало как обычно, где ColdFusion автоматически обрезает завершающие пробелы, что возможно с помощью приведенного ниже аргумента JVM.

-Dcoldfusion.trim.dbresult=true

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

Согласно этой ссылке, поведение в ColdFusion 11 было изменено и больше не обрезалось по умолчанию, и это свойство было введено в ColdFusion 11 Update 7 для включения старого поведения.

...