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(家庭电话)长度大于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,就是这样了。

每天进步一点点。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值