ITPub博客

首页 > 数据库 > 国内数据库 > 【YashanDB 知识库】php 查询超过 256 长度字符串,数据被截断的问题

【YashanDB 知识库】php 查询超过 256 长度字符串,数据被截断的问题

原创 国内数据库 作者:qiaoyikefu 时间:2025-02-20 16:30:36 0 删除 编辑

问题现象

如下图,php 使用 odbc 数据源,查询表数据, mysql 可以显示出来, yashan 显示数据被截断。

 

oracle 也显示正常,如下图:

 

isql 查询,超过 300 字节长度的 c1 字段,未显示, mysql 和 yashandb 表现一致。

 


问题的风险及影响

1 、 php 用 pdo_odbc 查询超过 256 长度的数据,数据被截断。

2 、 isql 查询超过 300 长度的数据,显示不出来。

 

问题影响的版本

23.2.4.14 及之前版本

 

问题发生原因

php 查询超过 256 字节数据,显示被截断: yashandb 的 odbc 驱动接口 SQLGetData 现在只支持单次查询,不支持多次取数据的操作。

isql 显示不出来, isql 工具最大只查询 300 长度的数据,超过了该长度未正常显示。

 

 

解决方法及规避方式

php 查询显示不出来,不用 pdo_odbc 扩展库,改用 php odbc 扩展库。

isql 规避方法,更改 isql 中 SQLGetData 取数据代码(可以改成循环取数或一次取全部数据),重新编译后,再投入使用。

规避后,php 能正常查询出来:

 

 

问题分析和处理过程

1 、查看 odbc.log ,发现 php 取数据的 buffer 长度是 256 , isql 的 buffer 长度是 300 。

2 、分析 php 取数据应用代码

发现 php_pdo 取数据代码逻辑,默认最大长度为 256 。超过 256 长度的数据,则循环多次取数据,取完为止。

php pdo_odbc 扩展库取数据逻辑:

 

 

php odbc 扩展库取数据逻辑:一次取整列大小的数据,由此得出相应的规避方法,改用 php odbc 方式取数据,则能正常取出数据。

 

 

代码如下:

odbc_php_exe 是规避接口

//test.php
function odbc_php_exe( ){

    print("star odbc php test\n");
    //$user="zabbix";
    //$password="123456";
    #$conn=odbc_connect("Driver={MySQL8.0};Server=192.168.7.134;Database= zabbix;", $user, $password);
    //$dsn="Driver={YashanDB};Server=192.168.24.49;Database=yashandb;port=4688;";
    $dsn="Yashandb";
    $user="sys";
    $password="yasdb_123";
    $conn=odbc_connect($dsn, $user, $password);     
    //$conn=odbc_connect($dsn,,'123456');
    if (!$conn){
        exit(" 连接失败 : " . $conn);
    }
     $sql = "select c1 ,c2 from test062";
    $rs=odbc_exec($conn,$sql);
     if (!$rs){
        exit("SQL 语句错误 ");
    }
      print("result:\n");

    while (odbc_fetch_row($rs)){
        $compname=odbc_result($rs,"c1");
        $conname=odbc_result($rs,"c2");
        echo "c1:$compname \n";
        echo "c2:$conname\n";
    }
    odbc_close($conn);
    echo "end\n";
}
 
function pdo_exe( ){
     try{
      $dsn="odbc:yashandb";
      //$dsn="odbc:MySQLCN";
      $pdo=new PDO($dsn);
        print("conn success\n");
        // 使用 pdo->query() 预处理并执行 sql 语句 , 以 PDOStatement 对象形式返回结果集 ,
      // 如果数据不存在则返回 false
       $sql = "select c1 ,c2 from test062";

      $rs = $pdo->query($sql);

      // 以关联数组的方式将结果集返回
      $all= $rs->fetchAll(PDO::FETCH_ASSOC);
      print_r($all);   
    }catch(PDOException $e){
        die("fail:".$e->getMessage()."\n");
    }
}
 //pdo_exe();
odbc_php_exe();
?>

3 、 isql 取数据逻辑

可以看到代码最大长度默认是 300

 

 

 

 

 

相关问题单

PHP 使用 ODBC 取长度超过 255 的字符串出现截断或乱码的异常


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70043300/viewspace-3073190/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2025-01-14

  • 博文量
    206
  • 访问量
    188331