【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是规避接口
//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
相关问题单
PHP使用ODBC取长度超过255的字符串出现截断或乱码的异常
原文地址:https://blog.csdn.net/cod0410/article/details/144373829
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!