微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

VARBINARY 列的 ODBC 数组提取导致服务器超时

如何解决VARBINARY 列的 ODBC 数组提取导致服务器超时

我有一个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_binmodeodbc_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'];

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。