这是我第一次注意到 ColdFusion 的这种行为。我在更新查询以使用 <cfqueryparam>
时遇到了这个问题.该代码在 ColdFusion 8 平台上运行。我没有此版本之外的行为引用。
此外,我们通常会使用 <cfqueryparam>
对于插入的值,这是促使调查此问题的原因。
对于这个例子,我们假设“first_string”和“second_string”包含一些文本,例如标题和一些带有来自 <textarea>
的换行符的段落文本。分别形成帖子。
我们还可以假设“md5_hashed_value”列的 SQL 数据类型是 char(32)。
场景 1:
<cfset hashed_value = hash(first_string & second_string, "MD5")>
<cfquery name="my_query" datasource="#my_datasource_name#">
INSERT INTO my_table
(
md5_hashed_value
)
VALUES
(
'#hashed_value#'
)
</cfquery>
在上面的第一个场景中,创建了一个散列值。
场景 2:
<cfquery name="my_query" datasource="#my_datasource_name#">
INSERT INTO my_table
(
md5_hashed_value
)
VALUES
(
'#hash(first_string & second_string, "MD5")#'
)
</cfquery>
在第二种情况下,计算出的散列值与第一种情况不同。
场景三
<cfquery name="my_query" datasource="#my_datasource_name#">
INSERT INTO my_table
(
md5_hashed_value
)
VALUES
(
<cfqueryparam value="#hash(first_string & second_string, "MD5")#" CFSQLType="CF_SQL_CHAR">
)
</cfquery>
在第三种情况下,插入数据库的值与第一种情况中插入的值相同。
为什么会这样? hash() 函数在所有情况下都以相同的方式被调用。它在代码中的位置是唯一的区别。当在 SQL 查询中直接调用 hash() 而不是通过 <cfqueryparam>
调用时,似乎发生了一些奇怪的事情。值或 <cfset>
.
最佳答案
这是我半生不熟的猜测。
<cfquery></cfquery>
与 <cfsavecontent></cfsavecontent>
不完全相同.我不认为 &
正在进行正常的字符串连接。所以这是对我的假设的检验。试试这些:
<cfset hashed_value = hash("" &first_string & second_string, "MD5")>
<cfquery name="my_query" datasource="#my_datasource_name#">
INSERT INTO my_table
(
md5_hashed_value
)
VALUES
(
'#hashed_value#'
)
</cfquery>
这和以前一样吗?我怀疑是这样。
<cfquery name="my_query" datasource="#my_datasource_name#">
INSERT INTO my_table
(
md5_hashed_value
)
VALUES
(
'#hash("" & first_string & second_string, "MD5")#'
)
</cfquery>
这和以前一样吗?我怀疑它没有。
解决方法
<cfquery name="my_query" datasource="#my_datasource_name#">
DECLARE @md5_hashed_value = '#hash(first_string & second_string, "MD5")#'
INSERT INTO my_table
(
md5_hashed_value
)
VALUES
(
@md5_hashed_value
)
</cfquery>
虽然这不具备 <cfqueryparam>
的所有优点,至少它参数化了你的查询
关于sql - 为什么 ColdFusion 哈希函数在这些场景中会返回不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59000217/