【YashanDB 知识库】php 查询超过 256 长度字符串,数据被截断的问题
本文内容来自 YashanDB 官网,原文内容请见:https://www.yashandb.com/newsinfo/7488290.html?templateId=1718516
问题现象
如下图,php 使用 odbc 数据源,查询表数据,mysql 可以显示出来,yashan 显示数据被截断。

oracle 也显示正常,如下图:

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

问题的风险及影响
1、php 用 pdo_odbc 查询超过 256 长度的数据,数据被截断。
2、isql 查询超过 300 长度的数据,显示不出来。
问题影响的版本
23.2.4.14 及之前版本
问题发生原因
php 查询超过 256 字节数据,显示被截断:yashandb 的 odbc 驱动接口 SQLGetData 现在只支持单次查询,不支持多次取数据的操作。
isql 显示不出来,isql 工具最大只查询 300 长度的数据,超过了该长度未正常显示。

解决方法及规避方式
php 查询显示不出来,不用 pdo_odbc 扩展库,改用 php odbc 扩展库。
isql 规避方法,更改 isql 中 SQLGetData 取数据代码(可以改成循环取数或一次取全部数据),重新编译后,再投入使用。
规避后,php 能正常查询出来:

问题分析和处理过程
1、查看 odbc.log,发现 php 取数据的 buffer 长度是 256,isql 的 buffer 长度是 300。

2、分析 php 取数据应用代码
发现 php_pdo 取数据代码逻辑,默认最大长度为 256。超过 256 长度的数据,则循环多次取数据,取完为止。
php pdo_odbc 扩展库取数据逻辑:

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

代码如下:
odbc_php_exe 是规避接口
3、isql 取数据逻辑
可以看到代码最大长度默认是 300


相关问题单
PHP 使用 ODBC 取长度超过 255 的字符串出现截断或乱码的异常
版权声明: 本文为 InfoQ 作者【YashanDB】的原创文章。
原文链接:【http://xie.infoq.cn/article/bfd9b69806de1b2b7a07cf7b4】。文章转载请联系作者。
评论