我的数据库是这个字符集
1 NLS_CHARACTERSET AL32UTF8
2 NLS_NCHAR_CHARACTERSET AL16UTF16
数据库字符集是Unicode(AL32UTF8)时,建表
create table AA
(
 A   VARCHAR2(2) default '是',
 B  NUMBER(12) not null);
为什么会报ORA-01401:插入的值对于列过大???
为什么改成这个就可以
create table AA
(
 A   VARCHAR2(3) default '是',
 B  NUMBER(12) not null);
这样就可以,为什么?????
如果需要从1 NLS_CHARACTERSET ZHS16GBK
2 NLS_NCHAR_CHARACTERSET AL16UTF16
这种字符集导入到我的库中该怎么导入,谢谢

解决方案 »

  1.   

    你的数据库字符集是Unicode(AL32UTF8)时,一个汉字要占3个字节
    所以报列过大
    我觉的应该是这样子的
      

  2.   

    把varchar2改成nvarchar2应该就不会出现这样的问题了
      

  3.   

    这样好了.你telnet到server上,打开sqlplus来建.我估计你是在pl/sql dev里面建的.
      

  4.   

    这个问题已经解决,就是把varchar2(2) 全部改成varchar2(3)、或用NVARCHAR(1)就可以了但新的问题又出现了,我要导入一个整库,有上万个表,不能都 这个改呀,郁闷中,希望知道的朋友告知ZHS16KGB字符集数据库向AL32UTF8字符集数据库导入怎么导?????
      

  5.   

    这个,你需要首先作字符集的转换,但转换之前你最好作一次csscan.字符集扫描.
    以确认,某些字符是否能够转,或者还是手工来转.
      

  6.   

    最近我也碰到类似的问题,详细给楼主说下哈:使用varchar2 定义VARCHAR2(3 char);  存储3个字符,使用数据库默认字符集。 gb2312最多存储2000字个字符,utf8最多存储4000节,多少字符要看存储的是什么字符
    使用nvarchar2 定义nvarchar2(3);     存储3个字符,使用unicode,最多存储2000个字符。
    作为对比
    使用varchar2 定义VARCHAR2(3 Byte);  存储3个字节,使用数据库默认字符集,和VARCHAR2(3 char) 的区别在于,最多存储3字节内容而不是3字符。VARCHAR2(Byte)就是普通的varchar2()。
    使用char  定义char(3);              存储3个字节,使用数据库默认字符集,和varchar2(3 Byte)的区别在于,无论存储的字符长度如何存储空间都是固定的3个字节。varchar2(byte)不考虑,因为需要大量修改倒入脚本,计算字节长度。
    char也不考虑,不仅要计算字节长度,还会浪费存储空间。对于是使用varchar2(char)还是nvarchar2,就要看他们的区别了,varchar2(char)使用数据库默认字符集保存数据,对于你的例子就是使用utf8保存数据,每个字符占三个字节。
    nvarchar2使用unicode保存数据,每个字符占两个字节。无论使用哪个都要修改建表的脚本。