在Oracle中建表时容易忽视的一个小问题

来源:互联网 发布:寻侠武功突破数据八门 编辑:程序博客网 时间:2024/06/10 01:42

用Oracle很多年了,突然发现了自己一直在犯的错误,详细说一下,呵呵,通常使用的Oracle是中文的方式,也就是SIMPLIFIED CHINESE_CHINA.ZHS16GBK字符集,看下面的这个测试:

create table testdb1(name varchar2(10),address varchar2(11));

insert into testdb1 values('一二三四五六七八九十','北京');在执行这个insert 时会报错:ORA-01401: 插入的值对于列过大,下面的这个是正确的,insert into testdb1 values('一二三四五','北京');

分析一下原因:  

      定义name是varchar2(10)是说明name字段最多可以保存10个字节的数据,而不是长度为10的字符串,如果字符串是半角的纯英文字符串,那真是可以保存10字符,可是现在是中文,测试一下:    select length('一二三四五六七八九十') length,vsize('一二三四五六七八九十') byte from dual;     LENGTH       BYTE    ---------- ----------    10            20       

一个汉字占2个字节是地球人都知道的事情了,所以如果字段值是要保存中文字符时,不能简单的以字数的长度来定义字段长度,而是要把字数乘以2作为字段长度。

呵呵这个问题看起来很小儿科,所以还是要避免才好

原创粉丝点击