ColdFusion:cfqueryparam用于二进制值

时间:2013-04-26 10:16:11

标签: coldfusion binary coldfusion-8 cfml cfqueryparam

我根据此链接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",但没有结果。 如何解决这个问题?提前致谢

1 个答案:

答案 0 :(得分:3)

就目前而言,将查询保持为:

并没有任何内在错误
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前缀。)