php - PDO OCI 截断大型多字节 CLOB

标签 php oracle pdo utf-8 oracle-call-interface

当 PDO OCI 通过 PDO::fetch() 返回我的行时,我的 CLOB 列已经是一个 PHP 流。对于包含多字节 UTF-8 字符的长 CLOB,当我读取此流时,它会被截断。

例子

  • 我的 CLOB 是一个由 8,193 个英镑符号(“£”)组成的字符串……16,386 字节
  • 我返回的行数组将列显示为“resource type='stream'”
  • 我执行 stream_get_contents() 以从流中获取字符串
  • 我的字符串是 8,192 个字符... 16,384 字节
  • 因此我失去了一个字符

另一个:

  • 我的 CLOB 是一个由 100,000 英镑符号组成的字符串... 200,000 字节
  • 同上步骤
  • 我的字符串是 50,848 个字符... 101,696 字节
  • 因此我丢失了 49,152 个字符

我可以使用三字节字符(“の”)看到类似的结果,其中正确工作的最大长度是 2730 个字符(8192 字节)。

我在使用原始 OCI 时遇到了同样的问题,我在 LOB 对象本身上使用了读取循环:

while !lob->eof() then lob->read(8192)

我能够通过获取整个 CLOB 的完整大小 (lob->size()) 并将其用作我的 LOB 读取大小来解决这个问题,从而将其全部整合在一起大量阅读。

我认为在 PDO OCI 中没有办法做到这一点。

我的预感是 PDO OCI 中的内部代码可能正在执行相同类型的读取循环以将 LOB 转换为 PHP 流。

似乎在原始 OCI 中对大于 8192 字节的 LOB 进行分块读取可能会被破坏,并且 PDO OCI 可能具有相同的错误。在我的一些测试中,我的直觉认为读取可能在一个多字节字符的中间结束,并且如果它试图在它认为是无效的 UTF-8 字节的下一个恢复上无声地失败。

有没有人遇到过这样的行为? PDO OCI 的任何解决方法?

我的环境:
- RHEL6 上的 PHP 5.5.24,oci8 v1.4.10 - Win7 上的 PHP 5.5.11,oci8 v1.4.10

最佳答案

事实证明这可能确实是一个 PDO_OCI 错误:“需要修复基本错误(目前还没有 ETA)”( https://github.com/php/php-src/pull/1566 ,指的是( https://bugs.php.net/bug.php?id=60994 )。

关于php - PDO OCI 截断大型多字节 CLOB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33026617/

相关文章:

php - 使用递归构建导航

php - 如何生成 token 并创建 url 以发送到电子邮件

php xdebug : How to profile forked process

php - 使用 jQuery 在 mySQL 表中添加新记录和更新记录失败

sql - For 循环和 PL/SQL 中的列

c# - OraOLEDB.Oracle 提供程序未在本地计算机上注册

sql - 在 Oracle Application Express 中为日历选择多列

php - "Base table or view not found"网络托管 pdo_mysql 错误

php - PDO Prepared 在单个查询中插入多行

php - SQLite 语法与 MySQL 不兼容?