insert into tab_t values ('ZHON')
*
ERROR at line 1:
ORA-12899: value too large for column "SYS"."TAB_T"."T_NAME" (actual: 4,maximum: 3)
?
从上面测试数据来看,插入三个英文字母成功,在插入四个字母的字符串时失败,提示实际长度为4,但maximum只有3
(5) 插入中文字符串数据测试
1)先计划一下“中”字占用几个字节
SQL> SELECT LENGTHB('中') FROM DUAL;
LENGTHB('中')
-------------
3
2)插入一个中文汉字
SQL> insert into tab_t values ('中');
1 row created.
?
3)插入两个中文汉字
SQL> insert into tab_t values ('中国');
insert into tab_t values ('中国')
*
ERROR at line 1:
ORA-12899: value too large for column "SYS"."TAB_T"."T_NAME" (actual: 6, maximum: 3)
插入两个中文汉字失败,实际长度为6,字段maximum只有3,在此验证确定,在UTF8下,一个中文汉字占3个字符。
?
5.3 将tab_t表的t_name列更改成char长度类型并做可插入长度测试
(1)将tab_t表的t_name列长度类型更改成char
SQL>alter table tab_t modify (t_name varchar2(3char));
(2)验证修改结果
SQL> selecttable_name,column_name,data_type,char_used from dba_tab_columns wheretable_name='TAB_T' ;
TABLE_NAME COLUMN_NAME DATA_TYPE CHAR_USED
-------------------- ----------------------- ------------------------- -----------------------------
TAB_T T_NAME VARCHAR2 C
(3) 插入两个中文汉字
?
SQL> insert into tab_t values ('中国');
1 row created.
varchar2(3 char)插入两个中文汉字成功
?
6、小结
经过对开发人员的需求进行判断,以及纠正其对NLS_LENGTH_SEMANTICS参数用途错误的理解,用修改表字段长度类型的方式解决其面临的实际问题,避免了一次不必要的数据库重启,以及问题得到真正的解决。