Oracle ORA-12899 报错
结论:ORA-12899 报错是插入的数据超出字段的设置长度导致的,实际插入的数据长度并不长,是因为Oracle字符集不同,汉字占用的长度不同导致的。解决办法一是增加字段长度,二是修改字符集。如果表中已经存有数据,修改字符集会导致表中原有数据中的汉字乱码,所以要先导出数据,再修改字符集,然后再把数据导入表中。下面讲一下我今天的处理方式
今天update时报错 ORA-12899,说数据长度是277,表字段长度是255,超长报错了
我们是有一张表在两个系统中同时存在,数据需要同步保持一致。现在在a数据库中update报错 ORA-12899,但是在数据库b中却保存成功,我首先检查了两张表的字段长度:
查询表字段长度:
describe a数据库名.表名;
describe b数据库名.表名;
经过检查,两张表的name字段长度都是255,我用sql查询和System.out.println()输出后发现,我update的值是99,根本没有超过255
然后我开始检查字符集,检查字符集的方式有多种,正常情况下都是用数据库连接工具查看,因为我们的项目对数据库管理严格,所有数据库都不能使用连接工具,所以我只能用我能查到的方式来查,至于连接工具查看字符集的方式,大家先自行百度吧,我后期看情况补上
查看数据库字符集
使用sql语句通过系统视图Nls_Database_Parameters查看数据库的系统参数。
SELECT * FROM Nls_Database_Parameters
进一步添加条件过滤出于字符集相关的记录、可以看到字符集的信息。
SELECT * FROM Nls_Database_Parameters where parameter in ('NLS_LANGUAGE','NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET')
前面的步骤是查看数据库的字符集,如果要查看本机客户端的字符 还可以用Userenv函数查看客户端字符集。
SELECT Userenv('language') FROM dual
因为我们a数据库这张表现有二十多万条数据,改字符集不现实,所以我选择修改字段长度,将长度改为300
alter table a数据库名.表名 modify 字段名 varchar2(300);
修改字段长度后,我重新update就成功了