Database上的设置为
Database Character Set :   Unicode(AL32UFL8)
National Character Set : AL16UTF16
Default language : American
Default Date Format :United States客户端的设置为:
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8现在需要导入如下的脚本:
INSERT INTO lead
  (lead_id,
   fullname)
VALUES
  ('2c9d8a951897f1a501189803f7210002',
   '陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈谍陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈陈')这段代码是UTF8格式的,其中字段fullname的长度为255,insert语句values中对应的字段为117个汉字“陈”,在UE中打开的时候这117的“陈”的长度是234,但是在插入的时候报错,内容如下:
ORA-12899: value too large for column "UBADMIN"."LEAD"."FULLNAME" (actual: 351,maximum: 255) 
也就是说插入的时候oracle把它长度算成351,是原来的三倍,在pl/sql developer 和oracle 本机linux上直接sqlplus执行的结果均是如此。
请教大侠,这个351是如何计算出来的,如何才能改变它的计算方法,让它计算成234?先多谢谢了,在网上没有搜索到关于插入时候如何计算字符串长度的文章, 如果有文章推荐也不胜感激。

解决方案 »

  1.   

    utf8和utf16不是标准的双字节码,这个“陈”字正好需要用三个字节来存,所以就超常了。
    参考这个连接看看。
    http://zhidao.baidu.com/question/15626866.html
      

  2.   

    你要存unicode建议fullname类型改nvarchar2吧
      

  3.   

    网上搜索来的=======================================
    在网络中有很多地方都有采用UTF8编码,由于要编写与邮件服务端有关的程序,而邮件服务端有些地方用到了UTF8编码,所以对它有了初步的认识!它其实和Unicode是同类,就是在编码方式上不同!
    首先UTF8编码后的大小是不一定,不像Unicode编码后的大小是一样的!我们先来看Unicode的编码:一个英文字母 “a” 和 一个汉字 “好”,编码后都是占用的空间大小是一样的,都是两个字节!而UTF8编码:一个英文字母“a” 和 一个汉字 “好”,编码后占用的空间大小就不样了,前者是一个字节,后者是三个字节!现在就让我们来看看UTF8编码的原理吧:
      因为一个字母还有一些键盘上的符号加起来只用二进制七位就可以表示出来,而一个字节就是八位,所以UTF8就用一个字节来表式字母和一些键盘上的符号。然而当我们拿到被编码后的一个字节后怎么知道它的组成?它有可能是英文字母的一个字节,也有可能是汉字的三个字节中的一个字节!所以,UTF8是有标志位的!  当要表示的内容是 7位 的时候就用一个字节:0*******   第一个0为标志位,剩下的空间正好可以表示ASCII 0-127 的内容。  当要表示的内容在 8 到 11 位的时候就用两个字节:110***** 10******   第一个字节的110和第二个字节的10为标志位。  当要表示的内容在 12 到 16 位的时候就用三个字节:1110***** 10****** 10******    和上面一样,第一个字节的1110和第二、三个字节的10都是标志位,剩下的空间正好可以表示汉字。  以此类推:
            四个字节:11110**** 10****** 10****** 10****** 
      五个字节:111110*** 10****** 10****** 10****** 10****** 
      六个字节:1111110** 10****** 10****** 10****** 10****** 10****** 
      .............................................
           ..............................................明白了没有?
    编码的方法是从低位到高位现在就让我们来看看实例吧! 黄色为标志位
    其它着色为了显示其,编码后的位置 Unicode十六进制
     Unicode二进制
     UTF8二进制
     UTF8十六进制
     UTF8字节数
     
    B
     00001011
     00001010
     B
     1
     
    9D
     00010011101
     11000010 10011101 
     C2 9D
     2
     
    A89E
     10101000 10011110
     11101010 10100010 10011110
     EA A2 9E
     3
     
    作者Blog:http://blog.csdn.net/zhjian6/
    相关文章
    在win2k下用vb得到硬件自检时的信息  
    Exchange Server关于文档属性扩充。  
    关于如何利用COM+,来提高ASP执行权限的问题!  
    关于在网站中图片入库和管理!  
    对UTF8编码的初步认识!  
      

  4.   

    如果你的字符集父集为AL16UTF16,子集为UTF8那么ORACLE字段长度是这样的。UTF16一个汉字占一个字节,既你字段定义多少长度就可以插多少个字符。UTF8个汉字占两个字节,所以报字段小的错误。