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

?>

3、isql取数据逻辑

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

image.png

image.png

相关问题单

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

相关文章
|
7月前
|
PHP C++ 索引
PHP 高效之道:字符串与数组处理的实用技巧
PHP 高效之道:字符串与数组处理的实用技巧
295 83
|
8月前
|
JSON 数据处理 PHP
PHP数组处理技巧:高效操作数据集合
PHP数组处理技巧:高效操作数据集合
|
8月前
|
JSON 安全 大数据
PHP中的数组处理艺术:灵活高效的数据操作
PHP中的数组处理艺术:灵活高效的数据操作
|
7月前
|
存储 JSON PHP
PHP数组键值转换的隐秘陷阱:整数还是字符串?
PHP数组键值转换的隐秘陷阱:整数还是字符串?
242 58
|
8月前
|
JSON 定位技术 PHP
PHP技巧:解析JSON及提取数据
这就是在PHP世界里探索JSON数据的艺术。这场狩猎不仅仅是为了获得数据,而是一种透彻理解数据结构的行动,让数据在你的编码海洋中畅游。通过这次冒险,你已经掌握了打开数据宝箱的钥匙。紧握它,让你在编程世界中随心所欲地航行。
261 67
|
11月前
|
存储 人工智能 搜索推荐
WiseMindAI:一款AI智能知识库,数据完全本地化,支持文档对话、10+种文档、10+AI大模型等
WiseMindAI 是一款由 Chris 开发的 AI 智能学习助手,支持数据完全本地化存储,确保用户隐私安全。它兼容多种文档格式(如 PDF、Markdown 等),并提供 AI 文档总结、智能笔记、沉浸式翻译、知识卡片生成等功能。此外,WiseMindAI 支持 10+ 大语言模型和自定义 AI 插件,适用于 Windows 和 Mac 平台,支持简体中文、繁体中文及英文。
1053 74
WiseMindAI:一款AI智能知识库,数据完全本地化,支持文档对话、10+种文档、10+AI大模型等
|
7月前
|
安全 PHP 数据库
PHP中的陷阱:字符串与数字比较时,你真的安全吗?
PHP中的陷阱:字符串与数字比较时,你真的安全吗?
|
10月前
|
PHP 开发者
PHP数据验证方法:如何检查一个字符串是否是email格式。
以上就是关于PHP如何检查一个字符串是否是email格式的全部内容。希望你在代码书写旅途中,能找到你的北斗星——简洁、高效、可靠的代码验证方式。让我们共同见证PHP的强大和丰富多彩!
255 16
|
11月前
|
SQL 关系型数据库 PostgreSQL
【YashanDB 知识库】从 PostgreSQL 迁移到 YashanDB 如何进行数据行数比对
【YashanDB 知识库】从 PostgreSQL 迁移到 YashanDB 如何进行数据行数比对
|
11月前
|
JSON 分布式计算 DataX
【YashanDB知识库】使用DataX工具迁移yashan数据到maxcompute
本文介绍使用崖山适配的DataX工具进行数据库迁移的方法,包括单表迁移和批量表迁移。单表迁移需配置json文件并执行同步命令;批量迁移则通过脚本自动化生成json配置文件并完成数据迁移,最后提供数据比对功能验证迁移结果。具体步骤涵盖连接信息配置、表清单获取、json文件生成、数据迁移执行及日志记录,确保数据一致性。相关工具和脚本简化了复杂迁移过程,提升效率。