2015-10-08 97 views
2

當PDO OCI通過PDO :: fetch()返回我的行時,我的CLOB列已經是PHP流。對於長字符的多字節UTF-8字符的情況下,當我讀這個流,它被截斷。PDO OCI截斷大型多字節CLOB

實例

  • 我CLOB是8193個英鎊符號(「£」)... 16386個字節的串
  • 我的返回的行陣列示出了列稱爲「資源類型=‘流’」
  • 我執行stream_get_contents()來獲得串出流的
  • 我的字符串爲8,192個字符... 16,384字節
  • 因此,我已經失去了一個字符

另:

  • 我CLOB是10萬個英鎊符號串...... 200000個字節
  • 按照上述步驟
  • 我的字符串是50848個字符... 101696個字節
  • 從而我輸了49,152個字符

我可以看到使用三字節字符(「の」)的類似結果,其中工作的最大長度是正確的ly是2730個字符(8192個字節)。

我不得不使用原始OCI,在這裏我用的是LOB對象本身的讀取循環同樣的問題:

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

我能夠得到的全尺寸來解決這個問題整個CLOB(lob->size()),並將其用作我的LOB讀取大小,從而將它全部放在一個大的閱讀中。

我沒有辦法在PDO OCI中做到這一點。

我的預感是PDO OCI中的內部代碼可能會執行相同類型的讀取循環來將LOB轉換爲PHP流。

看起來,在原始OCI中分塊讀取LOB> 8192字節可能會被破壞,並且也許PDO OCI具有相同的錯誤。在我的一些測試中,我的直覺認爲讀取可能在多字節字符的中間結束,如果它試圖下一次恢復所看到的無效的UTF-8字節,就會失敗。

有沒有人遇到過這種行爲?任何PDO OCI的解決方法?

我的環境:
- 在RHEL6 PHP 5.5.24,OCI8 v1.4.10 - Win7上PHP 5.5.11,OCI8 v1.4.10

+0

因爲PDO OCI似乎正在返回已經被截斷的流,所以我沒有任何事情可以在這一點之前做,以防止它被阻止。 – ashnazg

+0

嗯,我以前的搜索沒有發現這個bug - https://bugs.php.net/bug.php?編號= 60994 – ashnazg

+0

是的,我已經提到,要使用原始OCI工作,我必須顯式傳遞給LOB-> read()長度大於實際CLOB值的值,從而迫使讀取發生在一個大塊而不是「LOB-> eof()然後LOB-> read()」loopl – ashnazg

回答