问题描述
我有一个从 sql Server 数据库获取 VARBINARY(max)
数据的应用程序。在我的本地环境中,该应用程序通过 sql 驱动程序连接。 odbc_connect
的连接字符串包含:
DRIVER={sql Server}
我正在像这样获取 VARBINARY 数据:
// Hexadecimal data of attachment
$query = 'SELECT * FROM attachments WHERE LOC_BLOB_ID = ' . $blob_id;
$attach_result = odbc_exec($connection,$query);
odbc_binmode($attach_result,ODBC_BINMODE_CONVERT);
odbc_longreadlen ($attach_result,262144);
$attach_row = odbc_fetch_array($attach_result);
$hex_data = $attach_row['attachment_value'];
$binary = hex2bin($hex_data);
效果很好。现在我需要在服务器上运行这个应用程序,我唯一的选择是为 sql Server 使用 ODBC 驱动程序 17。连接字符串包含:
DRIVER={ODBC Driver 17 for sql Server}
而且它不起作用。它在上面预览的第 6 行(在 odbc_fetch_array
上)失败。我试过注释掉 odbc_binmode
和 odbc_longreadlen
行(我假设这个驱动程序可能会本地处理这些数据),但没有运气,同样的结果:服务不可用超时错误。
此宽度的 ODBC Driver 17 是否有不同的方法?
编辑:我发现它挂在 ODBC_BINMODE_CONVERT
上。如果我将其更改为 ODBC_BINMODE_RETURN
,它会在几秒钟内运行 - 但是输出是错误的。 ODBC_BINMODE_CONVERT
确实是我需要的,但是它没有及时处理整个数据(超时是30秒),这很奇怪,因为数据库中的VARBINARY字段只有65K个字符长,而且它在我的本地环境中运行速度非常快。
*Edit2: 我尝试将从数据库获取的不完整二进制数据转换为十六进制,然后再转换为 PNG,它显示图像的一半。所以我肯定它正在获取正确的数据,只是需要非常长的时间来获取该列,导致几乎在所有情况下都会超时。
解决方法
好的。终于想通了。最终对我有用的是使用 ODBC_BINMODE_RETURN
标志而不是 ODBC_BINMODE_CONVERT
,并且 NOT 最后使用 hex2bin()
转换。
我原始问题中的代码适用于 {SQL Server}
,以下代码适用于 {ODBC Driver 17 for SQL Server}
:
$query = 'SELECT * FROM attachments WHERE LOC_BLOB_ID = ' . $blob_id;
$attach_result = odbc_exec($connection,$query);
odbc_binmode($attach_result,ODBC_BINMODE_RETURN);
odbc_longreadlen ($attach_result,262144);
$attach_row = odbc_fetch_array($attach_result);
$binary = $attach_row['attachment_value'];