ColdFusion: cfqueryparam для двоичных значений
Я написал приведенный ниже запрос на основе справки, представленной в этой ссылке, запросив двоичный столбец, используя как в SQL Server
SELECT * FROM myTable
WHERE TestData >= 0x00010000
AND TestData < 0x00020000;
Он вернул ожидаемые результаты. я использовал cfqueryparam
и обновил запрос как:
SELECT * FROM myTable
WHERE TestData >= <cfqueryparam value="0x00010000" cfsqltype="cf_sql_binary">
AND TestData < <cfqueryparam value="0x00020000" cfsqltype="cf_sql_binary">;
но он вернулся с ошибками, сообщение об ошибке: Invalid data 0x00010000 for CFSQLTYPE CF_SQL_BINARY.
Я пробовал с cfsqltype="CF_SQL_BLOB"
но нет результатов. Как исправить эту проблему? заранее спасибо
1 ответ
В сущности, в сохранении запроса нет ничего плохого:
SELECT * FROM myTable
WHERE TestData >= 0x00010000 AND TestData < 0x00020000
(В идеале вы должны перечислять отдельные столбцы, а не использовать *
хоть.)
Тем не менее, хотя параметризация этих запросов не дает преимущества в плане безопасности (они не имеют переменных и, следовательно, не склонны к внедрению SQL-кода), все же может быть преимущество использования параметризованного SQL для целей кэширования единого плана выполнения.
Если у вас есть несколько запросов, в форме:
<cfquery...>
SELECT * FROM myTable
WHERE TestData >= 0x00010000 AND TestData < 0x00020000
</cfquery>
<cfquery...>
SELECT * FROM myTable
WHERE TestData >= 0x00020000 AND TestData < 0x00030000
</cfquery>
<cfquery...>
SELECT * FROM myTable
WHERE TestData >= 0x00030000 AND TestData < 0x00040000
</cfquery>
Использование cfqueryparam для них позволит кэшировать один план выполнения для нескольких запросов, что может привести к повышению производительности.
В этой ситуации вам нужно использовать BinaryDecode для преобразования вашей шестнадцатеричной строки в двоичное значение, которое может обрабатывать cfqueryparam, например:
<cfquery...>
SELECT * FROM myTable
WHERE TestData >= <cfqueryparam value=#BinaryDecode('00010000','Hex')# cfsqltype="cf_sql_binary" />
AND TestData < <cfqueryparam value=#BinaryDecode('00020000','Hex')# cfsqltype="cf_sql_binary" />
</cfquery>
(Обратите внимание, что 0x
префикс опущен.)