2016-03-22 10:34:17 3761次浏览 2条回答 0 悬赏 10 金钱

在oracle中字段类型为varchar2(4000)写入数据没有超出上限

插入测试数据11122223333不长的不会报错,内容长了之后会报错 仅能绑定要插入 LONG 列的 LONG 值
错误提示

最佳答案

  • javalzbin 发布于 2016-03-23 11:47 举报

    这个是错误属于oracle的错误,实际上,你的长度确实超过了其能保存的长度
    你的数据库字符集可能是UTF-8的,对于UTF-8或欧洲的某些字符集,oracle在存储时,对于一个字符需要2个或3个字节的存储空间,虽然表定义中为varchar2(4000),但是其实该字段的data_length为其2倍或3倍长。这种情况下oracle会把data_length长度超过4000的当做LONG型处理,所以报错。

    你可以这样测试这个问题:
    你说,插入测试数据11122223333不长的不会报错,内容长了之后会报错,你插入,4000/2-1的长度的字符串,看看会不会报错,然后,看看4000/2的字符串长度会不会报错,如果报错,再看看4000/3-1长度的字符串会不会报错,再看看4000/3的长度会不会报错

    还有就是,明确指定绑定VARCHAR处理:参考php的文档:
    http://php.net/manual/zh/function.oci-bind-by-name.php#92334

    //To avoid this error make sure you specify lengths when binding varchars e.g. 
    <?php
    oci_bind_by_name($stmt,':string',$string, 256);
    ?>
    
    //And for numerics use the default length (-1) but tell oracle its an integer e.g. 
    <?php
    oci_bind_by_name($stmt,':num',$num, -1, SQLT_INT);
    ?>
    

    先尝试下吧

    1 条回复
    回复于 2016-03-24 10:13 回复

    在此感谢你的回答,也许的确是超出了长度 我的解决办法是数据库中更换clob类型存储,使用PDO来操作数据

您需要登录后才可以回答。登录 | 立即注册
Sor
助理

Sor

注册时间:2016-03-20
最后登录:2017-03-06
在线时长:2小时7分
  • 粉丝0
  • 金钱55
  • 威望10
  • 积分175

热门问题