PHP_ODBC+GBase8S
查询大于
255
字节
lvarchar
字段的方法
PHP
通过
PDO_ODBC
模块查询
GBase8S
数据库的时候,如果
lvarchar
字段大于
255
,返
回空值。
建表语句:
create table t1(a lvarchar(256));
Insert into t1 values (‘abc’);
问题代码:
$dbh = new PDO('odbc:gbasedb, 'gbasedbt', 'gbasedbt');
foreach($dbh->query('select * from t1') as $row) { print_r($row);}
返回结果为空。
解决方法是设置
PDO::ODBC_ATTR_USE_CURSOR_LIBRARY
属性为
2
,代码如下:
$dbh = new PDO('odbc:gbasedb, 'gbasedbt', 'gbasedbt',
array(PDO::ODBC_ATTR_USE_CURSOR_LIBRARY => 2));
foreach($dbh->query('select * from t1') as $row) { print_r($row);}
返回正常结果。
原因分析:
pdo_odb
对大于
255
字节的
lvarchar
字段和小于等于
255
字节的
lvarchar
字段处理方式
不同。
lvarchar
类型小于等于
255
的时候,
pdo_odbc
接口的处理方式是:
1)
分配一个和列宽相同的内存
2)
调用
SQLBindCol
绑定内存
3)
调用
SQLFetchScroll
获取行
4)
从绑定的内存获取结果
lvarchar
类型大于
255
的时候,
pdo_odbc
接口的处理方式是:
1)
分配一个
256
字节大小的缓存
2)
调用
SQLFetchScroll
获取行
3)
调用
SQLGetData
接口分多次获取内容,从缓存填充到目标内存
可以看到,这两种情况的主要区别是是否通过
SQLBindCol
绑定列内存以及最后获取列
内容的方式。
当使用
pdo_odbc
连接数据库时未设置
ODBC_ATTR_USE_CURSOR_LIBRARY
属性
(
属性缺
省为
0)
,
unixODBC driver manager
通过自己的
cursor
库获取数据,如果没有调
SQLBindCol
绑定列,
cursor
库的
SQLFetchScroll
会报错,导致查询返回空值。
把
ODBC_ATTR_USE_CURSOR_LIBRARY
属性设置为
2
以后,
unixODBC driver manager
会
调用
GBase8s
的
SQLFetchScroll
,在未调用
SQLBindCol
绑定列的情况下可以正常工作。
官网网址:
www.gbase.cn
评论