一般设计数据库的时候,我们都考虑一个汉字占用两个字节。所以设计数据库的时候,如果认为某字段最长要存四个汉字,该字段都会定义为varchar2(8)。
SQL> create table t1 (col1 varchar2(8));
Table created.
但是测试插入三个汉字的时候就报错了。
SQL> insert into t1 values('一二三');
insert into t1 values('一二三')
*
ERROR at line 1:
ORA-12899: value too large for column T1.COL1 (actual: 9, maximum:8)
检查相关参数及环境变量。
SQL> select * from nls_database_parameters where parameter like 'NLS%CHARACTERSET';
PARAMETER VALUE
------------------------- --------------------
NLS_CHARACTERSET UTF8
NLS_NCHAR_CHARACTERSET UTF8
客户端NLS_LANG=AMERICAN_AMERICA.ZHS16GBK。
原来数据库使用的是UTF8字符集,难怪一个汉字占用3个字节。这样一来原先按一个汉字占两个字节设计的数据库,应用的时候很多字段都会因长度不够,出现ORA-12899错误。
不能把数据库的字符集改成ZHS16GBK。因为系统要求不仅能支持中文,还要能支持其他亚洲字符。这样CHARACTER SET就只能设这成UTF8或AL32UTF8,这两种字符集每个汉字占用的字节数分别是3和4,都不是2。
更改所有CHAR/VARCHAR字段的长度也不现实。整套系统是从其他公司买的产品,内含上千张表,逐个去修改字段不太可能。
查看参数NLS_LENGTH_SEMANTICS。
Oracl文档中的说明:
Syntax: NLS_LENGTH_SEMANTICS = string
Range of values: BYTE | CHAR
NLS_LENGTH_SEMANTICS enables you to create CHAR and VARCHAR2 columns using either byte or character length semantics. Existing columns are not affected.
NCHAR, NVARCHAR2, CLOB, and NCLOB columns are always character-based. You may be required to use byte semantics in order to maintain compatibility with existing applications.
NLS_LENGTH_SEMANTICS does not apply to tables in SYS and SYSTEM. The data dictionary always uses byte semantics.
查看数据库中该参数的设置。
SQL> select * from nls_database_parameters where parameter like 'NLS%SEMANTICS';
PARAMETER VALUE
------------------------- --------------------
NLS_LENGTH_SEMANTICS BYTE
SQL> show parameter nls_length
NAME TYPE VALUE
------------------------------------ ---------- -------
nls_length_semantics string BYTE
把该参数改成CHAR
SQL>alter system set NLS_LENGTH_SEMANTICS=BYTE scope=BOTH;
修改后查看参数。
SQL> show parameter nls_length
NAME TYPE VALUE
------------------------------------ ---------- -------
nls_length_semantics string CHAR
从新执行insert操作。
SQL> insert into t1 values('一二三');
insert into t1 values('一二三')
*
ERROR at line 1:
ORA-12899: value too large for column T1.COL1 (actual: 9, maximum:8)
还是出错!
新创建一张表,再测试。
SQL> create table t2 (col1 varchar2(8));
表已创建。
SQL> insert into t2 values('一二三')
已创建 1 行。
SQL> select * from t2;
COL1
----------------
一二三
OK了
再查看t1和t2的表结构,可以发现一些差别。
SQL> desc t1
名称 是否为空? 类型
-------------------- -------- -------------------------
COL1 VARCHAR2(8)
SQL> desc t2
名称 是否为空? 类型
-------------------- -------- -------------------------
COL1 VARCHAR2(8 CHAR)
参数NLS_LENGTH_SEMANTICS改成CHAR以后,t2.col1列可以存储8个汉字,英文字符也只能存储8个。
SQL> insert into t2 values('一二三四五六七八');
已创建 1 行。
SQL> insert into t2 values('abcdefgh');
已创建 1 行。
SQL> insert into t2 values('abcdefghi');
insert into t2 values('abcdefghi')
*
ERROR 位于第 1 行:
ORA-12899: value too large for column T2.COL1 (actual: 9, maximum:8)
分享到:
相关推荐
在运行查询SELECT * FROM V$SESSION 会出现ORA-29275:部分多字节字符的错误,这是什么原因开始我不得其解,网上也没有介绍什么好办法。本文给出答案。
出现ORA-12899,是字符集引起的,中文在UTF-8中占3个字节,ZHS16GBK中占2个字节,而源dmp文件字符集是ZHS16GBK库里倒出来的数据,现在要导入到目标字符集为UTF-8的库里,所以会出现ORA-12899 其实只要修改一下ORACLE 的...
使用工具IMPDP导入数据时ORA-39002、ORA-39070错误排查。使用工具IMPDP导入数据时ORA-39002、ORA-39070错误排查 使用工具IMPDP导入数据时ORA-39002、ORA-39070错误排查
ORACLE遭遇ORA-12899错误.doc
oracle数据库ora-01152和ora-01110的解决办法
ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法ora-00604 错误 解决 方法
Oracle 11gr2连Oracle 19c 报ORA-28040 ORA-01017解决方法
oracle网络配置(listener_ora-sqlnet_ora-tnsnames_ora).mht
Drop goldengate用户时,报ORA-00604 ORA-20782 ORA-06512错误
离线误删空间文件导致的ORA-01033及ORA-01145问题的解决办法,在解决ORA-01033的过程中,又出现ORA-01145 * 第 1 行出现错误: ORA-01145: 除非启用了介质恢复, 否则不允许立即脱机 接着的解决步骤
ORACLE ORA-00132 ORA-00214
oracle启动失败,ORA-00702报错,windows,linux系统下解决办法
ORA-06512 数字或值错误,字符缓冲区太小的解决方法。 有图有真相,希望对你有帮助。
客户端进行连接的时候,系统不定期出现ora-12520,ora-12516的连接问题, 问题解决方案建议: 1、增加process和session的连接数。 2、检查连接的应用,是不是有没有释放的连接。 3、将修改参数local_listener中的vip为...
ORA-12541 TNSno listener 的解决方案 ORA-12541 TNSno listener 的解决方案
本人在工作中,从测试库往正式库中复制记录,用select for update 报错:ORA-01480:STR 绑定值的结尾 Null字符缺失 ,遂上网查找,都说是有非法字符(半个引号) 或者长度超长造成的。根据本人分析,应该不是上述原因...
断电与ORA-600问题集断电与ORA-600问题集断电与ORA-600问题集断电与ORA-600问题集断电与ORA-600问题集断电与ORA-600问题集断电与ORA-600问题集断电与ORA-600问题集
win 8 升级 win 10 后,oracle 11g 无法启动及客户端连接,命令行sqlplus登录,startup 时报 ORA-00119 和 ORA-00132 的错误。 1. sqlplus /nolog 2. conn / as sysdba 3. startup 报错: ORA-00119 和 ORA-00132