【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 的字符串出现截断或乱码的异常

相关文章
|
1月前
|
Linux 数据库
【YashanDB知识库】YashanDB查询时间与实际时间默认少8小时
【YashanDB知识库】YashanDB查询时间与实际时间默认少8小时
|
30天前
|
存储 人工智能 搜索推荐
WiseMindAI:一款AI智能知识库,数据完全本地化,支持文档对话、10+种文档、10+AI大模型等
WiseMindAI 是一款由 Chris 开发的 AI 智能学习助手,支持数据完全本地化存储,确保用户隐私安全。它兼容多种文档格式(如 PDF、Markdown 等),并提供 AI 文档总结、智能笔记、沉浸式翻译、知识卡片生成等功能。此外,WiseMindAI 支持 10+ 大语言模型和自定义 AI 插件,适用于 Windows 和 Mac 平台,支持简体中文、繁体中文及英文。
216 74
WiseMindAI:一款AI智能知识库,数据完全本地化,支持文档对话、10+种文档、10+AI大模型等
|
1月前
|
Oracle 关系型数据库 Java
【YashanDB知识库】Flink CDC实时同步Oracle数据到崖山
本文介绍通过Flink CDC实现Oracle数据实时同步至崖山数据库(YashanDB)的方法,支持全量与增量同步,并涵盖新增、修改和删除的DML操作。内容包括环境准备(如JDK、Flink版本等)、Oracle日志归档启用、用户权限配置、增量日志记录设置、元数据迁移、Flink安装与配置、生成Flink SQL文件、Streampark部署,以及创建和启动实时同步任务的具体步骤。适合需要跨数据库实时同步方案的技术人员参考。
【YashanDB知识库】Flink CDC实时同步Oracle数据到崖山
|
24天前
|
PHP 开发者
PHP数据验证方法:如何检查一个字符串是否是email格式。
以上就是关于PHP如何检查一个字符串是否是email格式的全部内容。希望你在代码书写旅途中,能找到你的北斗星——简洁、高效、可靠的代码验证方式。让我们共同见证PHP的强大和丰富多彩!
48 16
|
1月前
|
SQL 关系型数据库 MySQL
【YashanDB知识库】字符集latin1的MySQL中文数据如何迁移到YashanDB
本文探讨了在使用YMP 23.2.1.3迁移MySQL Server字符集为latin1的中文数据至YashanDB时出现乱码的问题。问题根源在于MySQL latin1字符集存放的是实际utf8编码的数据,而YMP尚未支持此类场景。文章提供了两种解决方法:一是通过DBeaver直接迁移表数据;二是将MySQL表数据转换为Insert语句后手动插入YashanDB。同时指出,这两种方法适合单张表迁移,多表迁移可能存在兼容性问题,建议对问题表单独处理。
【YashanDB知识库】字符集latin1的MySQL中文数据如何迁移到YashanDB
|
30天前
|
SQL 关系型数据库 PostgreSQL
【YashanDB 知识库】从 PostgreSQL 迁移到 YashanDB 如何进行数据行数比对
【YashanDB 知识库】从 PostgreSQL 迁移到 YashanDB 如何进行数据行数比对
|
1月前
|
JSON 分布式计算 DataX
【YashanDB知识库】使用DataX工具迁移yashan数据到maxcompute
本文介绍使用崖山适配的DataX工具进行数据库迁移的方法,包括单表迁移和批量表迁移。单表迁移需配置json文件并执行同步命令;批量迁移则通过脚本自动化生成json配置文件并完成数据迁移,最后提供数据比对功能验证迁移结果。具体步骤涵盖连接信息配置、表清单获取、json文件生成、数据迁移执行及日志记录,确保数据一致性。相关工具和脚本简化了复杂迁移过程,提升效率。
|
1月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】从PostgreSQL迁移到YashanDB如何进行数据行数比对
本文介绍了通过Oracle视图`v$sql`和`v$sql_plan`分析SQL性能的方法。首先,可通过`plan_hash_value`从`v$sql_plan`获取SQL执行计划,结合示例展示了具体查询方式。文章还创建了一个UDF函数`REPEAT`用于格式化输出,便于阅读复杂执行计划。最后,通过实例展示了如何根据`plan_hash_value`获取SQL文本及其内存中的执行计划,帮助优化性能问题。
|
7月前
|
XML SQL PHP
php学习笔记-php字符串及字符串常用函数总结-day04
本文总结了PHP中字符串的三种定义方式和常用字符串处理函数,包括字符串的修剪、转换、长度计算、子串操作、比较、连接、分割及替换等操作。
php常用字符串,数组函数
php常用字符串,数组函数
下一篇
oss创建bucket