我正在将数据库从mssql express 2005迁移到postgresql 9.0。 在mssql中,列是图像类型,在postgresql中,我使用的是bytea类型。
<cffile
action="readbinary"
file="#ExpandPath('./uploads/')##theLogo.SERVERFILE#"
variable="myLogo">
<cfquery
name="saveLogo"
datasource="#SESSION.DSN#">
UPDATE bright.group SET LOGO = <cfqueryparam
cfsqltype="cf_sql_blob"
value="#myLogo#">
</cfquery>
上面的代码片段似乎在我保存时有效,但当我尝试使用下面的代码段显示图片时,我什么都没得到。
<cfquery
datasource="#SESSION.dsn#"
name="image">
SELECT LOGO
FROM bright.group
WHERE groupid=#URL.groupid#
</cfquery>
<cfcontent variable="#image.LOGO#" type="image/png">
这适用于mssql但不适用于postgres。
非常感谢任何帮助/方向。 感谢
答案 0 :(得分:2)
您能否进行适当的重构并放弃在数据库中保存图像?
将文件系统用于二进制文件和数据库,以保留这些资源的路径。它将加快您的应用程序并使未来的迁移变得更加容易。
答案 1 :(得分:1)
不太了解真正的机制,但这是我发现的。 图像以不同方式存储。我在十六进制查看器中打开了返回的图像。 postgresql文本匹配从第2个字节到结尾的mssql十六进制值。
我尝试了将postgresql输出转换为无效的所有内容。第一个字节不同并没有帮助。 最后,我将数据类型从bytea更改为text,并保存了编码的二进制文件。
<cffile action="readbinary" file="#ExpandPath('./logo.png')#" variable="myLogo">
<cfquery name="saveLogo" datasource="#session.dsn#">
UPDATE bright.group SET LOGO =
(<cfqueryparam value="#BinaryEncode(myLogo,'hex')#" cfsqltype='cf_sql_longvarchar'> )
</cfquery>
<cfquery datasource="#session.dsn#" name="qryGetLogo">
SELECT logo
FROM bright.group
WHERE groupid=#groupid#
</cfquery>
<cfcontent type="image/png" variable="#BinaryDecode(qryGetLogo.logo,'hex')#">
希望有人觉得这很有帮助。