鍍金池/ 問答/PHP  數(shù)據(jù)庫/ 大家用oracle如何保存大段的文本?

大家用oracle如何保存大段的文本?

用clob保存大段的文本

if(!$this->validate()){
    return false;
}
$model = new Article();
$model->TITLE = $this->TITLE;
$model->CID = $this->CID;
$model->CONTENT_DATA = $this->CONTENT_DATA;  //CONTENT_DATA的類型為CLOB
$model->save();

會出現(xiàn)如下錯誤

SQLSTATE[HY000]: General error: 1461 OCIStmtExecute: ORA-01461: can bind a LONG value only for insert into a LONG column (/tmp/pdo_oci/oci_statement.c:159)

然后我重寫了yii2中ocicommand這個類,修改的bindValues和bindPendingParams這個方法

protected function bindPendingParams()
    {
        foreach ($this->_pendParams as $name => $value) {
            if(isset($value[2])){
                $this->pdoStatement->bindParam($name, $value[0], $value[1], $value[2]);
            }else{
                $this->pdoStatement->bindParam($name, $value[0], $value[1]);
            }
        }
        $this->_pendParams = [];
    }

這樣,再長的數(shù)據(jù),都可以寫入數(shù)據(jù)庫,
但是每次更新,內(nèi)容都會變少。。。
第一次寫入
圖片描述

更新后變成
圖片描述

再更新會變的更少。。。。
實在無法理解。。。。

回答
編輯回答
壞脾滊

找到問題了

$this->pdoStatement->bindParam($name, $value[0], $value[1], $value[2]);

用上面的方法向數(shù)據(jù)庫中類型的clob的字段寫入數(shù)據(jù)時,要綁定數(shù)據(jù)的長度,就是$value[2]的值,這個值是通過
strlen計算出來的
這是一個坑。
舉例說明:
向數(shù)據(jù)庫中寫入數(shù)據(jù)『你好,世界,Hello world.....等等』大量的文本數(shù)據(jù),長度為 50000
第一次寫入,沒有任何問題,
用php從數(shù)據(jù)庫中讀取出來

$content = stream_get_content($row['content']);
echo strlen($content);
//這時輸出的長度會小于50000

所以每次更新時,都會丟失數(shù)據(jù)。。。

解決辦法就是,數(shù)據(jù)提交到后臺以后,先把大文本base64
然后再計算長度,再寫入數(shù)據(jù)庫,
至于base64大文本的效率如何,我沒有測試

2018年2月10日 05:12