Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

84

积分

1

好友

27

主题
1#
发表于 2012-12-26 15:20:24 | 查看: 11190| 回复: 8
本帖最后由 ShineCQY 于 2012-12-26 15:21 编辑

  数据库版本:11.2.0.3
  看到同事写的代码中有varchar2(200)和varchar2(200 byte) 搞不清楚是不是一样,如果不一样不知道有什么区别。
经常看到有表的连接条件如:bran_code=rdm_id         bran_code   varchar2(200)      rdm_id   varchar2(200 byte)  
  我不知道这样的连接条件还能不能生效
2#
发表于 2012-12-26 15:26:27
  1. Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
  2. Connected as gyhzyl@192.168.253.5:1521/orcl

  3. SQL>
  4. SQL> create table test1 (t1 varchar2(200 bytes))
  5.   2  /

  6. create table test1 (t1 varchar2(200 bytes))

  7. ORA-00907: 缺失右括号
  8. SQL> create table test2 (t1 varchar2(200))
  9.   2  /

  10. Table created

  11. SQL> drop table test2 purge;

  12. Table dropped

  13. SQL> show parameter nls_length;

  14. NAME                                 TYPE        VALUE
  15. ------------------------------------ ----------- ------------------------------
  16. nls_length_semantics                 string      BYTE

  17. SQL> alter session set nls_length_semantics=Char;

  18. Session altered

  19. SQL> create table test2(t1 varchar2(2));

  20. Table created

  21. SQL> insert into test2 values('北京');

  22. 1 row inserted

  23. SQL> insert into test values('bei');

  24. insert into test values('bei')

  25. ORA-00942: 表或视图不存在

  26. SQL> insert into test3 values('bei');

  27. insert into test3 values('bei')

  28. ORA-00942: 表或视图不存在

  29. SQL> insert into test2 values('bei');

  30. insert into test2 values('bei')

  31. ORA-12899: 列 "GYHZYL"."TEST2"."T1" 的值太大 (实际值: 3, 最大值: 2)

  32. SQL> insert into test2 values('北京另');

  33. insert into test2 values('北京另')

  34. ORA-12899: 列 "GYHZYL"."TEST2"."T1" 的值太大 (实际值: 3, 最大值: 2)

  35. SQL> commit;

  36. Commit complete

  37. SQL> alter session set nls_length_semantics=byte;

  38. Session altered

  39. SQL> create table test1 (t1 varchar2(4) );

  40. Table created

  41. SQL> insert into test1 values('北京');

  42. 1 row inserted

  43. SQL> select a.t1,b.t1 from test1 a,test2 b where a.t1 = b.t1;

  44. T1   T1
  45. ---- ----
  46. 北京 北京
复制代码

回复 只看该作者 道具 举报

3#
发表于 2012-12-26 16:18:43
  1. CREATE TABLE tab1 (
  2.       id           NUMBER(10),
  3.       description  VARCHAR2(20)
  4.     );

  5.   
  6.   
  7. CREATE TABLE tab2 (
  8.       id           NUMBER(10),
  9.       description  VARCHAR2(20 CHAR)
  10.     );
  11.   
  12.   
  13.   
  14. SQL> show parameter nls_length_semantics

  15. NAME                                 TYPE        VALUE
  16. ------------------------------------ ----------- ------------------------------
  17. nls_length_semantics                 string      BYTE


  18. SQL> desc tab1
  19. Name                                      Null?    Type
  20. ----------------------------------------- -------- ----------------------------
  21. ID                                                 NUMBER(10)
  22. DESCRIPTION                                        VARCHAR2(20)


  23. SQL> desc tab2
  24. Name                                      Null?    Type
  25. ----------------------------------------- -------- ----------------------------
  26. ID                                                 NUMBER(10)
  27. DESCRIPTION                                        VARCHAR2(20 CHAR)




  28. SQL>  alter session set NLS_LENGTH_SEMANTICS=char;

  29. Session altered.

  30. SQL>  desc tab1
  31. Name                                      Null?    Type
  32. ----------------------------------------- -------- ----------------------------
  33. ID                                                 NUMBER(10)
  34. DESCRIPTION                                        VARCHAR2(20 BYTE)


  35. SQL> desc tab2;
  36. Name                                      Null?    Type
  37. ----------------------------------------- -------- ----------------------------
  38. ID                                                 NUMBER(10)
  39. DESCRIPTION                                        VARCHAR2(20)



  40. SQL> create table tab3(t1 varchar2(20));

  41. Table created.

  42. SQL>
  43. SQL> desc tab3;
  44. Name                                      Null?    Type
  45. ----------------------------------------- -------- ----------------------------
  46. T1                                                 VARCHAR2(20)
复制代码
如以上演示NLS_LENGTH_SEMANTICS参数默认决定 char varhcar的语义是BYTE还是CHAR,默认该参数为BYTE,即默认 varchar2(200)= varchar2(200 byte)


注意对于SYS和SYSTEM而言 不受该NLS_LENGTH_SEMANTICS影响,始终为BYTE

请不要随意修改SYSTEM级别的NLS_LENGTH_SEMANTICS,否则一些成品套件例如EBS将可能无法正常运行

回复 只看该作者 道具 举报

4#
发表于 2012-12-28 21:37:19
太帅了,刘大,这个问题我早先也看到过,自己走SQL流程的时候不得法,随后也没深思,幸而这里有人提出来。您的整个SQL流程清晰明了,可谓醍醐灌顶,非常明白了。

回复 只看该作者 道具 举报

5#
发表于 2012-12-29 08:40:47
前二天也发现有这个东东,开发使用power design,在界面上,表的某一列点错,设置成varchar2(40 char)

回复 只看该作者 道具 举报

6#
发表于 2012-12-29 19:00:38
默认是字节还是字符由NLS_LENGTH_SEMANTICS参数控制.char有两个单位,char(字符)或者字节(byte),默认是字节。
单字节字符集 char(5 char) = 5×1 bytes = 5 bytes
双字节中文字符集char(5 char) = 5×2 bytes = 10 bytes
对于多字节字符集如1 char = 3 bytes,char(5 char) = 5×3 bytes = 15 bytes

回复 只看该作者 道具 举报

7#
发表于 2013-1-1 00:13:12
谢谢普及~

回复 只看该作者 道具 举报

8#
发表于 2013-1-1 12:35:29
很好的知识点啊。

回复 只看该作者 道具 举报

9#
发表于 2013-1-4 17:55:51
很不错!学习了!!

回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-12-26 12:55 , Processed in 0.049143 second(s), 20 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569