You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sybase数据库long binary图片数据PHP读取长度异常问题求助

Sybase long binary字段PHP ODBC提取截断问题

我折腾了好几天都找不到问题根源。我有一个Sybase表,其中用long binary字段存储JPG图片。用指定SQL查询提取图片时,PHP.ini的memory_limit已经设为4096M。直接在数据库执行查询,ImageData的长度是38924,但通过PHP的ODBC执行查询后,获取到的base64编码后的img字段长度只有4096。相关SQL和PHP代码如下:

查询图片的SQL语句

SELECT TOP 1 base64_encode(ImageData) as img, IL.Description As alt
     FROM ProductImage PI
    JOIN ImageLibrary IL
    ON PI.ImageId = IL.ImageId
    WHERE PI.ProductCode = '3894'
ORDER BY PI.ImageOrder 

查询ImageData长度的SQL语句

SELECT length(ImageData) as img, IL.Description As alt
     FROM ProductImage PI
    JOIN ImageLibrary IL
    ON PI.ImageId = IL.ImageId
    WHERE PI.ProductCode = '3894'
ORDER BY PI.ImageOrder

PHP代码

<?php

    /// GET THE IMAGE FROM IMAGE LIBRARY
    
    $conn = odbc_connect($connect_string,'','');
    $Image='';
    $Alt ='';
    $query='';  
    $query = "SELECT TOP 1 base64_encode(ImageData) as img, IL.Description As alt";
    $query .= " FROM ProductImage PI";
    $query .= " JOIN ImageLibrary IL ";
    $query .= " ON PI.ImageId = IL.ImageId";
    $query .= " WHERE PI.ProductCode = '3894'";
    $query .= " ORDER BY PI.ImageOrder";
    //var_dump ($query);
    $res = odbc_exec($conn,$query)or die("Whoops! I could not run this query " . $query);
    $num_rows = odbc_num_rows($res) & 0xffffffff;     
    $rows = array();
   
    while (odbc_fetch_row($res)) {

      
   $len = strlen(odbc_result($res,"img"));
   

   If ($len > 0){
      $image = odbc_result($res,"img");
      $alt = odbc_result($res,'alt');
    } else {
      $image='No Image binary goes here';
      $alt = 'No Image saved sorry';
     }
  }
 
?>

解决方法

1. 避免在SQL中做base64编码,改用PHP处理

数据库端的base64编码结果可能被ODBC驱动截断,建议直接获取原始二进制数据,在PHP中进行编码:

修改后的SQL:

SELECT TOP 1 ImageData, IL.Description As alt
FROM ProductImage PI
JOIN ImageLibrary IL
ON PI.ImageId = IL.ImageId
WHERE PI.ProductCode = '3894'
ORDER BY PI.ImageOrder

修改后的PHP代码:

<?php
/// GET THE IMAGE FROM IMAGE LIBRARY
$conn = odbc_connect($connect_string,'','');
$image='';
$alt ='';
$query = "SELECT TOP 1 ImageData, IL.Description As alt";
$query .= " FROM ProductImage PI";
$query .= " JOIN ImageLibrary IL ";
$query .= " ON PI.ImageId = IL.ImageId";
$query .= " WHERE PI.ProductCode = '3894'";
$query .= " ORDER BY PI.ImageOrder";

$res = odbc_exec($conn,$query)or die("Whoops! I could not run this query " . $query);

// 配置ODBC处理长字段
odbc_binmode($res, ODBC_BINMODE_PASSTHRU);
odbc_longreadlen($res, 0); // 0表示无长度限制

while (odbc_fetch_row($res)) {
    $binaryData = odbc_result($res, "ImageData");
    if ($binaryData !== false && strlen($binaryData) > 0) {
        $image = base64_encode($binaryData);
        $alt = odbc_result($res,'alt');
    } else {
        $image='No Image binary goes here';
        $alt = 'No Image saved sorry';
    }
}
?>

2. 调整ODBC驱动配置

检查Sybase ODBC驱动的设置,找到“最大字符串长度”相关参数,将其调整为大于base64编码后的预期长度(38924字节的二进制数据base64编码后约为51900字节)。

3. 确认PHP ODBC扩展的长字段处理

确保PHP的ODBC扩展正确处理长字段,使用odbc_binmode设置二进制数据传递模式,odbc_longreadlen设置长字段的读取长度限制(设为0表示不限制),这两个函数需要在odbc_exec之后、odbc_fetch_row之前调用。


内容的提问来源于stack exchange,提问作者AmbientGuitar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 07:57:56