misuoka / ocipdo
基于 OCI API 封装的 Oracle PDO 数据库驱动
v0.1.8
2020-05-14 15:00 UTC
Requires
- php: >=7.0
Requires (Dev)
- phpunit/phpunit: ^6.2
README
基于 OCI API 封装的 Oracle PDO 数据库驱动
说明
由于官方很久没有对 PDO_OCI 更新了,其驱动源码默认不支持 Oracle 11g 及以上版本的数据库。当然也可在编译前修改 config.m4 文件使之支持,但安装之后,PDO_OCI 使用中却存在问题,如果数据库中存储中文,查询后会出现字符截断,无法得到预期的结果。
本库使用基于 OCI API 封装的 PDO 接口数据库驱动 misuoka\ocipdo,用来对 Oracle 数据库进行操作。
有关 PDO_OCI 字符截断问题的链接:https://my.oschina.net/startphp/blog/195333
使用方法
使用前提
你的运行环境已经安装了 oci 驱动
安装方法可参考:
安装 ocipdo
使用 composer 进行安装 composer require misuoka/ocipdo
use ocipdo\PDO as OCIPDO; // $dns => oci:dbname=//localhost:1521/orcl // $username => 用户名 // $password => 密码 $pdo = new OCIPDO($dns, $username, $password);
注意事项
由于 Oracle 数据库中有 CLOB 和 BLOB 字段,CLOB 是存储文本大对象,BLOB 是存储二进制大对象,在 OCI 中二者对应的数据类型不一样:
- 使用
oci_bind_by_name
绑定CLOB
数据时,需要设置的类型为SQLT_CLOB
。 - 使用
oci_bind_by_name
绑定BLOB
数据时,需要设置的类型为SQLT_BLOB
。
而 PDO 的预定义常量中,只有 PDO::PARAM_LOB
是对大对象数据的类型定义,无法区分用户要写入的数据字段是 CLOB
还是 BLOB
,故本驱动 misuoka\ocipdo 进行了如下设定:
PDO::PARAM_LOB
对应于要写入的是CLOB
数据PDO::PARAM_LOB + PDO::PARAM_LOB
对应于要写入的是BLOB
数据
$ret = $stmt->bindValue(':CLOB_CONTENT', $data['CLOB_CONTENT'], \PDO::PARAM_LOB); // 写入 CLOB 数据 $ret = $stmt->bindValue(':BLOB_CONTENT', $data['BLOB_CONTENT'], \PDO::PARAM_LOB + \PDO::PARAM_LOB); // 写入 BLOB 数据