大家用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();

会出现如下错误

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 = [];
    }

这样,再长的数据,都可以写入数据库,
但是每次更新,内容都会变少。。。
第一次写入
https://img3.mukewang.com/5c8f3ee90001ccad03210186.jpg

更新后变成
https://img3.mukewang.com/5c8f3eea000148d102630156.jpg

再更新会变的更少。。。。
实在无法理解。。。。

慕娘9325324
浏览 849回答 1
1回答

绝地无双

找到问题了 $this->pdoStatement->bindParam($name, $value[0], $value[1], $value[2]); 用上面的方法向数据库中类型的clob的字段写入数据时,要绑定数据的长度,就是$value[2]的值,这个值是通过strlen计算出来的这是一个坑。举例说明:向数据库中写入数据『你好,世界,Hello world.....等等』大量的文本数据,长度为 50000第一次写入,没有任何问题,用php从数据库中读取出来 $content = stream_get_content($row['content']); echo strlen($content); //这时输出的长度会小于50000 所以每次更新时,都会丢失数据。。。 解决办法就是,数据提交到后台以后,先把大文本base64然后再计算长度,再写入数据库,至于base64大文本的效率如何,我没有测试
打开App,查看更多内容
随时随地看视频慕课网APP