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

简介: php 查询超过 256 字节数据,显示被截断:yashandb 的 odbc 驱动接口 SQLGetData 现在只支持单次查询,不支持多次取数据的操作。isql 显示不出来,isql 工具最大只查询 300 长度的数据,超过了该长度未正常显示。

问题现象

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

1.JPEG

oracle 也显示正常,如下图:

2.JPEG

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

问题的风险及影响

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

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

问题影响的版本

23.2.4.14 及之前版本

问题发生原因

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

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

解决方法及规避方式

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

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

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

5.JPEG

问题分析和处理过程

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

6.JPEG

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

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

php pdo_odbc 扩展库取数据逻辑:

7.JPEG

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

8.JPEG

代码如下:

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

9.JPEG
10.JPEG

相关问题单

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

相关文章
|
5月前
|
JSON 数据处理 PHP
PHP数组处理技巧:高效操作数据集合
PHP数组处理技巧:高效操作数据集合
|
5月前
|
JSON 安全 大数据
PHP中的数组处理艺术:灵活高效的数据操作
PHP中的数组处理艺术:灵活高效的数据操作
|
5月前
|
JSON 定位技术 PHP
PHP技巧:解析JSON及提取数据
这就是在PHP世界里探索JSON数据的艺术。这场狩猎不仅仅是为了获得数据,而是一种透彻理解数据结构的行动,让数据在你的编码海洋中畅游。通过这次冒险,你已经掌握了打开数据宝箱的钥匙。紧握它,让你在编程世界中随心所欲地航行。
175 67
|
7月前
|
SQL 测试技术 数据库
【YashanDB知识库】IMP跨网络导入慢问题
问题现象:290M数据,本地导入2分钟,跨机导入耗时显著增加(最高30分钟)。 原因分析:`imp`逐条SQL通过网络传输至yashanDB执行,交互频繁导致性能下降。 影响版本:客户测试环境22.2.8.3。 解决方法:将导入文件上传至与yashanDB同机后使用`imp`,减少网络延迟。 经验总结:优化`imp`工具,支持直接上传文件至服务器端执行,降低网络依赖。
|
7月前
|
监控 数据库
【YashanDB 知识库】ycm 托管数据库时报错 OM host ip:127.0.0.1 is not support join to YCM
在托管数据库时,若 OM 的 IP 被设置为 127.0.0.1,将导致无法托管至 YCM,并使数据库失去监控。此问题源于安装时修改了 OM 的监听 IP。解决方法包括:将 OM 的 IP 修改为本机实际 IP 或 0.0.0.0,同时更新 env 文件及 yasom 后台数据库中的相关配置。经验总结指出,应避免非必要的后台 IP 修改,且数据库安装需遵循规范,不使用仅限本机访问的 IP(如 127.0.0.1)。
|
7月前
|
监控 网络安全 数据库
YashanDB 知识库:ycm 纳管主机安装 YCM-AGENT 时报错 “任务提交失败,无法连接主机”
在安装 ycm-agent 纳管主机时,可能出现因端口未开放导致的报错问题。此问题会阻止 YCM 对主机和数据库的监控功能,影响版本为 `yashandb-cloud-manager-23.2.1.100-linux-aarch64.tar`。原因是目标主机(如 10.149.223.121)未开放 9070 或 9071 端口。解决方法包括关闭防火墙、添加白名单或开放指定端口,需与管理员确认操作。处理过程涉及网络检查、端口测试等步骤。端口问题解决后,若再次安装报唯一键错误,需先移除失败主机再重试。
|
7月前
|
监控 Java Shell
【YashanDB 知识库】ycm 托管数据库时,数据库非 OM 安装无法托管
本文主要介绍了因数据库未按规范使用 yasboot 安装导致的问题及解决方法。问题表现为无 yasom 和 yasagent 进程,且目录结构缺失,致使 ycm 无法托管与监控。分析发现可能是数据库版本旧或安装不规范引起。解决方法为先生成配置文件,安装 yasom 和 yasagent,再生成并修改托管配置模板,最终通过命令完成托管至 yasom 和 ycm。总结强调了按规范安装数据库的重要性以避免类似问题。
|
8月前
|
SQL 关系型数据库 MySQL
【YashanDB知识库】MySQL field 函数的改写方法
【YashanDB知识库】MySQL field 函数的改写方法
php学习笔记-php字符串及字符串常用函数总结-day04
本文总结了PHP中字符串的三种定义方式和常用字符串处理函数,包括字符串的修剪、转换、长度计算、子串操作、比较、连接、分割及替换等操作。
php常用字符串,数组函数
php常用字符串,数组函数
147 0