为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕娘9325324 2019-03-11 05:22:19
用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 = []; } 这样,再长的数据,都可以写入数据库,但是每次更新,内容都会变少。。。第一次写入 更新后变成 再更新会变的更少。。。。实在无法理解。。。。
查看完整描述

1 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

找到问题了

$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大文本的效率如何,我没有测试

查看完整回答
反对 回复 2019-03-18
  • 1 回答
  • 0 关注
  • 848 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信