PHP 查询 YashanDB 超过 256 字符的数据被截断? 看这里快速搞定!
在使用 PHP 通过 ODBC 访问 YashanDB 数据库时,有用户反馈:查询字段长度超过 256 字节的数据时,结果显示被截断。这个问题看似奇怪,但其实和 ODBC 接口的行为密切相关。本文将带你全面分析原因,并提供实用的规避方案。

一、问题现象
使用 PHP 的 PDO_ODBC 查询 YashanDB 表中某字段 c1.如果其长度超过 256 字节,结果会被截断;
使用 isql 工具执行相同 SQL,也无法完整显示超过 300 字节的数据;
但在 MySQL 或 Oracle 中同样语句执行正常,显示完整数据。

二、影响范围
问题出现于 YashanDB 23.2.4.14 及以下版本;
涉及 ODBC 驱动与 isql 工具的默认数据读取逻辑。

三、问题根因分析
1. ODBC 驱动行为限制
当前版本的 YashanDB ODBC 驱动接口 SQLGetData 仅支持一次性获取数据;
而 PHP 的 PDO_ODBC 实现,默认每次只取 256 字节,超出部分需通过多次 SQLGetData 调用获取;
由于 YashanDB 还不支持多次取数,导致超长字符串显示被截断。

2. isql 工具本身限制
isql 工具中 SQLGetData 默认最多返回 300 字节内容;
超过部分会被直接省略,因此你在终端中也看不到完整内容。

四、解决方案与绕过方式

方案一:更换 PHP 扩展为 ODBC
改用 PHP 的原生 ODBC 扩展库(而非 PDO_ODBC),因为它会一次性读取整列数据。示例如下:
方案二:修改 isql 源码并重新编译

如果你希望 isql 工具支持超过 300 字节的显示,可以:
修改其源码中 SQLGetData 对数据长度的限制逻辑;
改成“循环获取”或“一次性读取全部数据”;
然后重新编译生成 isql 执行文件。
这样,isql 就能完整展示长字段内容。
五、排查经验分享
查看 odbc.log 文件,发现 PDO_ODBC 的默认 buffer 为 256 字节;
而 isql 的默认 buffer 为 300 字节;


对比两种 PHP 扩展取数逻辑后发现,PDO_ODBC 依赖多次调用 SQLGetData,而 ODBC 扩展则是一次性读取;
进一步确认:问题并非 PHP 自身限制,而是 YashanDB 当前 ODBC 驱动的实现行为。
六、结语
YashanDB 作为国产数据库中兼容性较好的代表,在多数场景中表现稳定,但在一些语言驱动兼容细节上仍在不断完善中。通过使用合适的方式(如更换 PHP 扩展)可以顺利规避问题,提升使用体验。
评论