[转]Oracle中字符集的类型决定varchar2的字符长度

avatar
作者
筋斗云
阅读量:14

1.前几天往数据库表里面插入数据的报了一个这样的错误如下:

SQL> insert into student values('中华人民共和',60);

insert into student values('中华人民共和',60)

第 1 行出现错误:

ORA-12899: 列 "SYSTEM"."STUDENT"."NAME" 的值太大 (实际值: 12, 最大值: 6)

本来建立表的时候字符长度就设置为6了,可是插入六个中文的时候就是报错,表结构如下:

SQL> desc student;

名称 是否为空? 类型

----------------------------------------- -------- ----------------------------

NAME VARCHAR2(6)

AGE NUMBER(3)

后来经过查了大量的资料之后发现,varchar2的长度是有字符集的类型决定的。

内容如下:

varchar2最大是4000字节,那么就看你的oracle字符集,如果字符集是16位编码的,ZHS16GBK,那

么每个字符16位,2字节,可以容纳一个中文字符,所以可以容纳2000字符。如果是AL32UTF8编码的字符集,三个字节为一个中文字符,那么只能存储 1333个字符。

2.查看字符集的类型的语句:

SQL> set wrap off;

SQL> select parameter,value from nls_database_parameters where parameter like 'NLS_CHARACTERSET';

PARAMETER VALUE

------------------------------ -------------------------------------------------

NLS_CHARACTERSET ZHS16GBK

所以上面插入的字符就只能是3个中文字符。

如果将上面的字符编码改为32位编码的,则只能存入1.5个中文字符。

3.10 查看新建数据库的字符集设置

SQL> set wrap off

SQL> set lines 1000

SQL> select * from nls_database_parameters;

4.可以用update props$ set value$='ZHS16GBK' where;

来修改字符集

5.如果字符集为AL32UTF8,可以看出下面的例子为,每个中文占用三个字节。

SQL> select lengthb('中') from dual;

LENGTHB('中')

-------------

为此,可以在定义列的大小的时候通过附加BYTE或者CHAR关键字,已来指示字段是占用的的字节数还是字符数。对于开始提出的问题,我们可以使用VARCHAR2(6 CHAR),那么就可以存储6个中文字符了。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!