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

简介: 本文分析了YashanDB中PHP通过ODBC查询数据时出现的数据截断问题,表现为超过256字节的数据被截断,以及isql工具无法显示超过300字节长度的数据。问题根源在于YashanDB的ODBC驱动仅支持单次查询,且PHP扩展库默认缓冲区限制。解决方案包括改用PHP ODBC扩展库而非PDO_ODBC,以及调整isql代码逻辑以支持循环取数或一次性读取完整数据。文章还提供了具体代码示例和规避方法,适用于23.2.4.14及更早版本。

本文内容来自YashanDB官网,原文内容请见 https://www.yashandb.com/newsinfo/7488290.html?templateId=1718516

问题现象

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

oracle也显示正常,如下图:

image.png

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

image.png

问题的风险及影响

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

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

问题影响的版本

23.2.4.14及之前版本

问题发生原因

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

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

image.png

解决方法及规避方式

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

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

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

image.png

问题分析和处理过程

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

image.png

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

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

php pdo_odbc扩展库取数据逻辑:

image.png

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

image.png

代码如下:

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();

?>
AI 代码解读

3、isql取数据逻辑

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

image.png

image.png

相关问题单

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

目录
打赏
0
0
0
0
96
分享
相关文章
【YashanDB知识库】使用DBeaver 插入数据 nvarchar字段插入为空
【YashanDB知识库】使用DBeaver 插入数据 nvarchar字段插入为空
【YashanDB知识库】使用DBeaver 插入数据 nvarchar字段插入为空
【YashanDB 知识库】YMP 校验从 yashandb 同步到 oracle 的数据时,字段 timestamp(0) 出现不一致
【YashanDB 知识库】YMP 校验从 yashandb 同步到 oracle 的数据时,字段 timestamp(0) 出现不一致
【YashanDB知识库】YashanDB JDBC驱动查询时抛出io fail:Read timed out异常
【YashanDB知识库】YashanDB JDBC驱动查询时抛出io fail:Read timed out异常
【YashanDB知识库】YashanDB JDBC查询时抛出YAS-02094
【YashanDB知识库】YashanDB JDBC查询时抛出YAS-02094
|
2天前
|
SQL
【YashanDB知识库】手工迁移Doris数据到崖山分布式
【YashanDB知识库】手工迁移Doris数据到崖山分布式
【YashanDB知识库】YashanDB JDBC驱动查询时抛出io fail:Read timed out异常
【YashanDB知识库】YashanDB JDBC驱动查询时抛出io fail:Read timed out异常
【YashanDB知识库】YashanDB查询时间与实际时间默认少8小时
【YashanDB知识库】YashanDB查询时间与实际时间默认少8小时
【YashanDB知识库】load data一次导入多个文件的数据时报错
【YashanDB知识库】load data一次导入多个文件的数据时报错
【YashanDB知识库】YMP校验从yashandb同步到oracle的数据时,字段timestamp(0)出现不一致
【YashanDB知识库】YMP校验从yashandb同步到oracle的数据时,字段timestamp(0)出现不一致
【YashanDB知识库】使用DBeaver 插入数据 nvarchar字段插入为空
【YashanDB知识库】使用DBeaver 插入数据 nvarchar字段插入为空