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

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

问题现象

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

image-2024-08-07-16-33-49-528

oracle也显示正常,如下图:

image2024-8-8_10-22-47

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

image2024-8-8_9-10-41

问题的风险及影响

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

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

问题影响的版本

23.2.4.14及之前版本

问题发生原因

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

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

image2024-8-8_9-52-15

解决方法及规避方式

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

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

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

image-2024-08-07-16-38-11-756

问题分析和处理过程

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

image2024-8-8_9-19-18

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

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

php pdo_odbc扩展库取数据逻辑:

image2024-8-8_9-23-11

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

image2024-8-8_9-24-59

代码如下:

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

image2024-8-8_9-29-27

image2024-8-8_9-29-33

相关问题单

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

posted @   YashanDB  阅读(5)  评论(0编辑  收藏  举报
编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示