a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 156|回复: 1

[考试辅导] Oracle性能调优:字符集

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
oracle字符集问题解决分为两种情况:
! t, y8 z3 z9 B9 n    7 y& ^: t' M% P- n' P1 d
    一、解决客户端问题,临时解决。(意思是把当前的环境变量设置来和系统的语言一样。以oracle为准。)0 p2 U, ^7 \$ e0 U% Q/ R
   
+ Q$ n# k6 s+ m4 }+ \- o% t    查看oracle字符集4 h# c; K/ U( I7 y
   
5 Q' a# Y8 t) X/ w. }5 |    SQL> select userenv('language') from dual;2 Y* l8 g8 o' R2 G+ R
    , {2 y3 r0 O1 ]0 ]. N, q
    USERENV('LANGUAGE')/ J* n0 g% p, p) a
    / G' j6 Z/ \# J7 ?. B
    --------------------------------------------------------------------------------
- ]/ F# W4 Q) d9 Z/ q3 C* s   
  f1 ?# l4 O$ ]7 D1 _8 q6 e    SIMPLIFIED CHINESE_CHINA.UTF8
; J( f  e) |& x% B      \- n& w% i; {* h/ K$ X2 x
    查看linux系统字符集
  a0 f' \1 c8 f0 V   
; o" ~+ _. b% ^9 r5 p. p# {    [root@ora ~]# env |grep LANG" s! i7 N. r- T" b4 g
    / n2 q4 Y5 i+ c) l# z1 V2 c" p& M3 c% R
    LANG=zh_CN.UTF-8; D# v, `% B) m! \( }3 A- A
    / Q; l% @! l. E- p% \( W& Y3 r0 A
    GDM_LANG=zh_CN.UTF-8
( o& {' S4 s/ s9 M# X5 [   
5 `+ p4 N0 x4 a( g    定义linux系统字符集# N! L0 O& T& I
   
/ @( _# T# o) h4 _1 n5 \6 {    [root@ora ~]# export NLS_LANG='SIMPLIFIED CHINESE_CHINA.UTF8'
% E/ P* \) S3 v. l    : O' _5 I# g3 A% C
    定义oracle环境字符集, [2 |. ?5 ?  Z
    ( U3 x; g( R. h
    [root@ora ~]# su - oracle' w* ?" c! {. R' G1 Y$ |" g
    5 n7 m; `6 J2 j& r- E- W! Y
    [oracle@ora ~]$ export NLS_LANG='SIMPLIFIED CHINESE_CHINA.UTF8', W* K6 }5 J. x! n: z
    ; K& M" l1 X: P5 h
    [oracle@ora ~]$ !sql" r! r- J  @* f& U/ D3 X+ {
   
* m: r) A$ v" n3 }    查看结果7 D# ?3 c. A9 h, S: ]* G
    9 }/ E0 `; \0 s1 [+ `
    SQL> select * from database_properties;/ y! S# x/ X, T% }, ?0 ]
    $ _. q; u( \* d9 R& a  w6 r) h
    二、这种刚好相反,修改oracle与os一样(这种是盖总写的,一起学习了)下面也写出了两种方法,copy过来的,请大家参考6 _, d. q6 }, Q& V3 z6 i2 A
    ! n$ i0 b5 n, g, y; F9 s1 E  a
    Linux 下更改 oracle客户端字符集和服务端字符集$ [& M- E$ M3 A
    $ U5 X# {8 Z5 ~7 M% M/ B9 B
    1.Linux 下更改 oracle客户端字符集,即设置环境变量" NLS_LANG"的值7 |' N2 N' e- X& }( V) B$ W
    ' x$ L- r3 P! d$ b
    查看客户端字符集,在终端下执行:
( Q' [  y3 u  i    " f; V9 [, T6 `+ i" p
    echo $NLS_LANG
* J3 E# @3 b8 `. n) W   
' ~0 C  W- d6 Z% k- d3 A- Q  f    修改客户端字符集:
+ A& h0 l* }4 m5 }   
' {6 V4 Q0 o. ?+ |2 f6 G' a    sudo gedit /etc/environment; e8 c$ b& [+ N
    , \+ f/ @7 b* D
    在environment 文件中增加以下内容:
3 D' l! B* ?1 S   
$ b9 g( v7 }6 ^6 A$ R$ X+ w    NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
6 R0 H" E$ T; t5 x% Q  X- ]+ Y# q7 O  x    - u9 M. z! \7 m2 n+ _& X
    export NLS_LANG$ L, j, D5 N. q+ Y9 j7 T
    4 {5 m( r& y% C9 r* T
    重新启动操作系统即可。
6 d9 s3 L0 W! y1 w2 g( d; z    5 \. ^8 W7 [. Y  u; P0 @2 g
    2. 修改 oracle服务端的字符集。9 c4 Z, ?2 q- j  ?
   
1 h) u5 ]% U6 K    查看服务端字符集:
. v, i# E7 }8 [9 o' h; R   
) X2 S4 @0 g! ^! e" U. z    select userenv('language') from dual;" H! U% s3 N9 m# r; |% _
   
1 S& p1 ^$ H! Z: h7 G    修改服务端字符集,终端下执行:
& ]5 a& }+ g4 r: r. P    6 k5 n: U0 m7 }  w0 O
    $ORACLE_HOME/bin/sqlplus /nolog
/ p& {6 f( l5 s: P$ @    - i) `4 t, p% _- L
    进入sqlplus 命令行
% O- |/ y; r' c4 B   
. x8 `$ h5 k  n9 m' v' x    SQL>conn / as sysdba;
: t4 f2 W/ E" s$ w* ^) d   
8 _8 c( }6 B1 n8 t( L+ E, K' \1 Q    1 ) . 关闭数据库
, i* m3 X* t" B# v   
& d  ?4 [$ S9 H( `7 R8 ~- H    SQL>SHUTDOWN IMMEDIATE;
  s( o9 ]4 w7 C; l4 M   
) c& b! v8 a7 a/ k4 Q    2 ) . 启动到 Mount3 _! A) s8 x. f* m) c2 V
   
* F$ B" _" r( y2 s1 `# T    STARTUP MOUNT;
' u, R2 M/ p0 w& a6 k0 F   
) {, |6 y4 z! I* G% F% b; o    ALTER SYSTEM ENABLE RESTRICTED SESSION;
' K+ C9 r4 e) Y" w    , P% L' d$ d1 r3 D1 K1 S+ i: @
    ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;/ z( s5 W) c/ L( K
   
! _; G: \3 m% ~6 k( r/ l! c8 W    ALTER SYSTEM SET AQ_TM_PROCESSES=0;9 y% x& {& r. ~! @- g
    ) g9 G5 M( ?$ e& V, D
    ALTER DATABASE OPEN;
! o2 N9 G0 [) V9 u3 M   
) V+ ~, c) i# ]& k  G0 i" T    ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;. g& w# @' o! W
    4 l  B* G& }; M7 k
    -- 下面一行语句可能会出现错误提示,可以不理会
( g/ O  f" V% u: q   
% A' J# H7 R6 H; U8 A  E+ R    ALTER DATABASE national CHARACTER SET INTERNAL ZHS16GBK;$ P& ~5 L& P+ _& d
    3 `) g* e& f7 F5 v. J
    SHUTDOWN IMMEDIATE;( X9 A  ]9 ^; l5 h- S) t& B
    ; r% l* d0 {% \% l; e
    STARTUP;
回复

使用道具 举报

 楼主| 发表于 2012-8-4 14:06:20 | 显示全部楼层

Oracle性能调优:字符集

3. 修改 dmp文件字符集, Y3 Z5 {+ I. V4 j: Q& F" b
   
" V. m, Y8 Z1 ^. m    dmp 文件的第2第3 字节记录了字符集信息,因此直接修改dmp文件的第2 第3字节的内容就可以'骗'过oracle 的检查。这样做理论上也仅是从子集到超集可以修改,但很多情况下在没有子集和超集关系的情况下也可以修改,我们常用的一些字符集,如 US7ASCII,WE8ISO8859P1 ,ZHS16CGB231280,ZHS16GBK 基本都可以改。因为改的只是dmp文件,所以影响不大。7 m6 {1 {' e2 R
   
* F& P! C2 ~% N    具体的修改方法比较多,最简单的就是直接用UltraEdit 修改dmp文件的第2 和第3个字节。比如想将dmp 文件的字符集改为ZHS16GBK,可以用以下SQL 查出该种字符集对应的16进制代码:
& O2 l4 K5 n! q4 W& U9 t4 m/ J    8 Q% e+ F2 C  V8 A/ ?" l" a, l
    SQL> select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual;
4 t( \5 o! J# [! D   
6 I* T: w# C, [8 o    0354* \5 C$ K5 m: e' C0 j5 q) @% x2 @: A
   
+ n4 B3 {9 E5 f+ H! x6 t& p/ ?, a    然后将dmp 文件的2、3 字节修改为0354即可。
4 U+ Q1 x* h5 n1 K; D   
$ @- q: N% c7 n    Oracle 提供标准函数,对字符集名称及 ID进行转换 :4 Q( w; y) k! Q" N3 \9 u
    % l/ |5 d) X  A
    SQL> select nls_charset_id('ZHS16GBK') from dual;% I0 E: u0 A7 F" j: w
    & v& [( \- |+ s5 t
    NLS_CHARSET_ID('ZHS16GBK')
; B' n3 P, t0 a  |5 C1 U; N5 s    # l. b  @& p) a
    -------------------------( l) R8 ^8 ]$ P  Y
    4 x0 U* Y- N+ }
    852; \; Z4 [1 n5 y
   
5 t" s) W/ R5 b5 _7 s    1 row selected.# v) ^9 }  }' e: \1 B
    5 n- H, _% P; V; R& N3 w+ A1 q. u
    SQL> select nls_charset_name(852) from dual;
5 Q) e% N# s: ~1 M6 I    " T' f0 f% G- g- C1 Z9 ]' k
    NLS_CHAR  Q  J3 e( }0 T6 a$ }3 a; G  G* b6 X
    5 `+ C& j' X' Y+ G; `! c3 p
    --------% |* w) w  ?" s' r+ ~
   
1 h, q4 R) n* b9 P    ZHS16GBK
. I0 P* R0 f. v% m      M5 e& g, j  o! H6 `2 U) r, |% @
    1 row selected.# h" ?) P1 F- l8 b0 x/ V/ x
   
7 ~7 E' [8 ^4 t7 b6 ?: t    十进制转换十六进制 :% E8 S0 V0 ~: Z* U4 a( ?
    6 \, \, j, \. \- I
    SQL> select to_char('852','xxxx') from dual;
9 g7 N- `2 ?5 o- ^7 Z# f4 I% T/ D    ' @6 K' U3 t% V
    TO_CH+ ^% q: c3 g% U4 L& h
    0 n5 t* i& F2 |* i" R  b
    354
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-7 17:59 , Processed in 0.200472 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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