美文网首页
ORA-01441:无法减小列长度,因为一些值过大

ORA-01441:无法减小列长度,因为一些值过大

作者: 乐百事52淑熙 | 来源:发表于2018-01-30 19:07 被阅读0次

    在修改数据库中表zz中的字段jtdh长度时,出现了如下的问题:

    ORA-01441:无法减小列长度,因为一些值过大

    看一下我的思路,我先将zz表中jtdh(家庭电话)长度大于30的jtdh(家庭电话)写入bz(备注)

    update zz set bz=bz||'原家庭电话信息:'||jtdh,gxsj=sysdate where length(jtdh)>'30';

    之后将zz表中jtdh(家庭电话)长度大于30的jtdh(家庭电话)截取长度为30的数据

    update zz set jtdh=substr(jtdh,1,30),gxsj=sysdate where length(jtdh)>'30';

    commit;

    最后,修改zz表中jtdh(家庭电话)长度为30

    alter table zz modify jtdh VARCHAR2(30);

    是不是觉得这一切都是正常的,没有问题,为什么会报错呢?

    实际上这里需要注意的就是:字符与字节的区别

    例如:

    update zz set bz=bz||'原家庭电话信息:'||jtdh,gxsj=sysdate where length(jtdh)>'30';

    就是将字符长度大于30的取出来,但是汉字在oracle中占一个字符,三个字节,就应该写成

    update zz set bz=bz||'原家庭电话信息:'||jtdh,gxsj=sysdate where lengthb(jtdh)>'30';

    将上面所有按字符取长度的换成按字节取长度,sql如下:

    update zz set bz=bz||'原家庭电话信息:'||jtdh,gxsj=sysdate where lengthb(jtdh)>'30';

    update zz set jtdh=substrb(jtdh,1,30),gxsj=sysdate where lengthb(jtdh)>'30';

    commit;

    之后修改字段长度:

    alter table zz modify jtdh VARCHAR2(30);

    OK,就是这样了。

    每天进步一点点。

    推荐微信公众号【排骨肉段】,记录日常的美好。

    相关文章

      网友评论

          本文标题:ORA-01441:无法减小列长度,因为一些值过大

          本文链接:https://www.haomeiwen.com/subject/gzaczxtx.html