oracle-01441,ORA-01441:无法减小列长度,因为一些值过大
在修改数据库中表zz中的字段jtdh长度时,出现了如下的问题:ORA-01441:无法减小列长度,因为一些值过大看一下我的思路,我先将zz表中jtdh(家庭电话)长度大于30的jtdh(家庭电话)写入bz(备注)update zz set bz=bz||'原家庭电话信息:'||jtdh,gxsj=sysdate where length(jtdh)>'30';之后将zz表中jtdh(家庭电话
在修改数据库中表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,就是这样了。
每天进步一点点。
推荐微信公众号【排骨肉段】,记录日常的美好。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)