當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
因爲PDO OCI似乎正在返回已經被截斷的流,所以我沒有任何事情可以在這一點之前做,以防止它被阻止。 – ashnazg
嗯,我以前的搜索沒有發現這個bug - https://bugs.php.net/bug.php?編號= 60994 – ashnazg
是的,我已經提到,要使用原始OCI工作,我必須顯式傳遞給LOB-> read()長度大於實際CLOB值的值,從而迫使讀取發生在一個大塊而不是「LOB-> eof()然後LOB-> read()」loopl – ashnazg