字段NVARCHAR2(2000),全部用汉字做数据更新测试的,两千个字符,一行50个共40行,在PL/SQL Developer中通过编辑数据表格提交后,查询数据只剩下1961个汉字,加上39个换行符正好2000,而用Update语句则只能更新1333个汉字(去除了换行),如果再加2个字母数字的话也可以,但3个就不行了,提示“ORA-01704字符串太长了”错误,我在所开发的Delphi程序中通过TClientDataSet提交,中文字符连1333个都不到,但提示的是“ORA-01461:仅能绑定要插入 LONG 列的 LONG 值”错误,求解!!
nvarchar2

解决方案 »

  1.   

    -- 要允许某字段能存放最多多少个汉字的话,最好用类似于 NVARCHAR2(2000 CHAR)
    -- 但是,NVARCHAR2类型最多只能允许4000个字节,即: NVARCHAR2(4000 BYTE)
    10:39:41 SCOTT@myora > create table test1(cname varchar2(3999 byte));表已创建。10:39:45 SCOTT@myora > create table test2(cname varchar2(4000 byte));表已创建。10:39:55 SCOTT@myora > create table test3(cname varchar2(4001 byte));
    create table test3(cname varchar2(4001 byte))
                                      *
    第 1 行出现错误:
    ORA-00910: 指定的长度对于数据类型而言过长
      

  2.   

    而你数据库不同的字条集,单个汉字占用的字节数也不一样。
    所以,VARCHAR2(4000 BYTE) 所能容纳最多汉字个数也不一样。
    -- 你可以用如下SQL先查看一下你的数据库字符集:
    select *
    from nls_database_parameters
    where parameter = 'NLS_CHARACTERSET';PARAMETER                      VALUE
    ------------------------------ ------------------------------
    NLS_CHARACTERSET               AL32UTF8
    -- 例如,我的数据库的字符集是AL32UTF8,我知道该字符集一个汉字占三个字节,
    -- 那么这个时候,我创建一个 VARCHAR2(4000 BYTE)的字段最多能存放1333个汉字10:47:23 SCOTT@myora > create table test2(cname varchar2(4000 byte));表已创建。10:48:18 SCOTT@myora > insert into test2(cname) select lpad('罗',4000,'罗') from dual;已创建 1 行。10:48:27 SCOTT@myora > insert into test2(cname) select lpad('罗',4001,'罗') from dual;已创建 1 行。10:48:43 SCOTT@myora > insert into test2(cname) select lpad('罗',4002,'罗') from dual;已创建 1 行。10:48:50 SCOTT@myora > commit;提交完成。10:48:52 SCOTT@myora > select length(cname) from test2;LENGTH(CNAME)
    -------------
             1334
             1334
             133410:49:17 SCOTT@myora > select length(cname), lengthb(cname) from test2;LENGTH(CNAME) LENGTHB(CNAME)
    ------------- --------------
             1334           4000
             1334           4000
             1334           4000
    -- 如上例子所示,表面上看,三条记录均已插入成功,其实,数据库内部作了截断操作。
      

  3.   

    nvarchar跟字符集有关,nvarchar(2000)是存储2000个字符,如果是utf8的字符集,是要4个字节存储一个汉字,除去数据块头和pctfree,应该到不了2000个汉字,一个块是8192字节码,超过一个块,就写不下了。
    你用utf16就行了,utf16是两个字节存储一个汉字。
      

  4.   


    我用的是NVARCHAR2类型,长度最大2000,字符集也是AL32UTF8,但是为什么在PL/SQL Developer里面通过数据表格进行修改更新,字符可以保存到1961个,加上回车换行正好2000个?我因为程序中用到一个文本比较多的字段,因为程序兼容原因不能用CLOB字段,所以用数个nvarchar2字段切分保存,我不知道该按多大的长度来切分文本,是否应该包括回车,按2000来分是会报错的(我这里的2000是不管中文英文都只算1个字符)
      

  5.   

    和数据库编码有关系,UTF一个汉字占3个字节