我根据此链接中提供的帮助编写了以下查询,querying binary column using like in 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"
但没有结果。
如何解决这个问题?提前致谢
最佳答案
就目前情况而言,将查询保留为以下内容并没有本质上的错误:
SELECT * FROM myTable
WHERE TestData >= 0x00010000 AND TestData < 0x00020000
(理想情况下,您应该列出各个列,而不是使用 *
。)
然而,虽然参数化这些查询没有安全性好处(它们没有变量,因此不容易受到 SQL 注入(inject)),但为了缓存单个执行计划而参数化 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
前缀被省略。)
关于ColdFusion:二进制值的 cfqueryparam,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16234017/