设为首页 收藏本站
查看: 548|回复: 0

[经验分享] ORACLE字符类型详解----char、nchar、varchar、varchar2、nvarchar2

[复制链接]
YunVN网友  发表于 2016-8-14 07:36:42 |阅读模式
    oracle提供了五种字符数据类型:char、nchar、varchar、varchar2、nvarchar2。
   char:使用数据库字符集来存储数据,长度固定,如果存储的数据没有达到指定长度,自动补足空格。指定长度时,默认长度的计量单位由NLS_LENGTH_SEMANTICS(默认为字节byte)参数决定,但是我们可以手动指定为char或者byte。oracle建议使用NLS_LENGTH_SEMANTICS来指定计量单位,这样可以提高效率。char类型的最大存储长度为2000个字节,在plsql中,最大存储长度可以达到32767个字节。使用char时,可以不指定最大长度,此时最大长度为1.
   nchar:使用国家字符集来存储数据,长度固定,如果存储的数据没有达到指定长度,数据库自动补足空格。指定长度时,采用char为计量单位,不可以手动指定其他单位。最大存储长度为2000个字节,在plsql中,其最大存储长度可以达到32767个字节。使用nchar时,可以不指定最大长度,此时最大长度为1.
   varchar2:
使用数据库字符集存储数据,长度可变,如果存储数据没有达到指定长度,不自动补足空格。可使用char,byte为计量单位,默认受参数NLS_LENGTH_SEMANTICS的影响。最大存储长度为4000个字节,在plsql中,存储长度可达32767个字节。必须指定最大长度,长度最小值为1.

   nvarchar2:使用国家字符集来存储数据,长度可变,如果存储的数据没有达到指定长度,不自动补足空格。指定长度时,采用char为计量单位,不可以手动指定其他单位。最大存储长度为4000个字节,在plsql中,其最大存储长度可以达到32767个字节。必须指定最大长度,长度最小值为1.
   varchar:oracle目前并没有实现该数据类型,当前版本下,varchar与varchar2完全一致,但不保证将来不会单独设计varchar。
  
   下面我们只讨论char和varchar2的区别,至于nchar  nvarchar2 varchar,我相信聪明的同仁们肯定可以触类旁通。
    1:char 与varchar2在存储上的区别,仅仅在于char会使用空格来填充空间,由于varchar2采用变长的方式存储数据,因此可以节省空间,这是毋庸置疑的。
    2:在效率方面,varchar2和char在某些情况下,各有优劣,并没有实质上的差别。可以参考tom大师的文章:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2668391900346844476
    3:在字符比较上的差别,是char和varchar2的主要差别。当两个字符串进行比较时,如果其中任何一个字符串为varchar2类型(文本串作为char类型来处理),那么两个字符串直接进行比较;如果不存在varchar2类型的字符串,在比较之前,会将其中较短的字符串末尾补充空格至与较长字符串长度一致,然后进行字符的比对。
  

SQL> create table tab1(c1 char(10),c2 varchar2(10));
表已创建。
SQL> insert into tab1 values('easypoint','easypoint');
已创建 1 行。
SQL> select * from tab1 where c1='easypoint';
C1   C2
---------- ----------
easypoint  easypoint
SQL> select * from tab1 where c2='easypoint';
C1   C2
---------- ----------
easypoint  easypoint
SQL> select * from tab1 where c2=cast('easypoint' as varchar2(10));
C1   C2
---------- ----------
easypoint  easypoint
SQL> select * from tab1 where c1=cast('easypoint' as varchar2(10));
未选定行
SQL> select * from tab1 where c2=cast('easypoint' as char(10));
未选定行
SQL>
SQL> select * from tab1 where c2='easypoint ';
未选定行
SQL> select * from tab1 where c1='easypoint ';
C1   C2
---------- ----------
easypoint  easypoint
  
   从上面的代码可以看出,由于char的自动补足,以及char和char类型比较时的自动长度对齐,使得字符串数据的处理显得难以捉摸。当然,我们可以使用trim或者rpad函数来进行字符串的处理,但是这往往会导致索引的失效。
      4:char类型数据可能造成数据信息的丢失,例如,我们赋值”aaa  " 给变量B char(10),当B接收的变量时,其存储内容为"aaa    ",此时,我们无处指定赋值给B的原始值是否包含空格以及包含多少空格。
      5:在plsql程序中,在编译时刻,oracle会为char类型分配指定最大长度的内存;对于varchar2类型,如果最大长度没有超过4000,则在编译时,分配指定最大长度的内存;如果长度超过或者等于4000,oracle会在运行时刻分配符合实际值大小的内存。
     
   结论:使用varchar2数据类型作为字符串的首选类型,即便是在处理”男“,”女“这样的性别数据时,使用char类型也不比varchar2类型显得有优势。
  另外,补充一点,当我们将空字符串‘’赋值该字符变量时,其存储值为null。字符类型在底层的存储结构为:null标识符+长度+实际数据

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-257592-1-1.html 上篇帖子: oracle客户端tnsping,提醒:TNS-03505: 无法解析名称 下篇帖子: Oracle数据库PL/SQL快捷键设置详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表