ColdFusion:cfqueryparam用于二进制值

ColdFusion:cfqueryparam用于二进制值,coldfusion,binary,coldfusion-8,cfml,cfqueryparam,Coldfusion,Binary,Coldfusion 8,Cfml,Cfqueryparam,我根据此链接中提供的帮助编写了以下查询 但它返回了错误,错误消息:CFSQLTYPE CF\u SQL\u BINARY的无效数据0x00010000。 我尝试使用cfsqltype=CF\u SQL\u BLOB,但没有结果。 如何解决这个问题?提前感谢就目前情况而言,将查询保留为以下状态没有本质上的错误: SELECT * FROM myTable WHERE TestData >= <cfqueryparam value="0x00010000" cfsqltype="cf_s

我根据此链接中提供的帮助编写了以下查询

但它返回了错误,错误消息:CFSQLTYPE CF\u SQL\u BINARY的无效数据0x00010000。 我尝试使用cfsqltype=CF\u SQL\u BLOB,但没有结果。
如何解决这个问题?提前感谢

就目前情况而言,将查询保留为以下状态没有本质上的错误:

SELECT * FROM myTable
WHERE TestData >= <cfqueryparam value="0x00010000" cfsqltype="cf_sql_binary"> 
  AND TestData < <cfqueryparam value="0x00020000" cfsqltype="cf_sql_binary">;
SELECT * FROM myTable
WHERE TestData >= 0x00010000 AND TestData < 0x00020000
对这些查询使用cfqueryparam将允许为多个查询缓存单个执行计划,这可能会带来更好的性能

在这种情况下,需要使用将十六进制字符串转换为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前缀被忽略。

错误可能是因为您传入的是字符串,而不是二进制值。尝试BinaryDecode'00010000'、'Hex'?此外,您可能不需要在此处使用cfqueryparams-如果值是静态的,而不是由第三方动态提供的,并且您没有多个查询,只有值在更改,即SQL除了二进制值外是相同的,那么这样做可能没有任何好处。感谢您的工作。你是对的,对于静态值没有好处。但我们的客户仍然想要这个功能。再次感谢。@PeterBoughton不!!!您应该始终通过cfqueryparams传递值,为什么?只是因为你永远不知道有一天会如何使用这些代码。也许有一天它会通过API或其他什么东西暴露出来,永远不要认为懒惰和写坏代码是可以的,尤其是在安全方面。无论发生什么,这都是前所未有的事情,忘记了对输出到浏览器的数据进行实体编码。公平地说,有很多糟糕的程序员忘记了这一点,这就是为什么一半的互联网容易受到xss攻击的原因,但这仍然没有体现出David,如果你想进行搜索,你可能会看到数百次,所以我提醒人们使用cfqueryparam。您一定误解了我在这里所说的,因为上面的代码在任何方面都不是懒惰或糟糕的代码-一个静态值,而且要清楚,我所说的是硬编码的值,而不是不修改代码就不能向API公开变量,此时将添加cfqueryparams。
<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>
<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>