ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle 字符集設置

oracle 字符集設置

原创 Linux操作系统 作者:zwc1083 时间:2009-04-24 15:44:12 0 删除 编辑

问题描述:

在客户端插入字符“咪咪”,从数据库中查询显示时出现乱码

处理步骤:

10.1 对数据库做全库导出,备份全库数据,以防故障发生

首先设定客户端的字符集,必须以ZHS16GBK的字符集导出,然后才能在更改失败后顺利倒入新建的库。

#setenv NLS_LANG "SIMPLIFIED CHINESE_CHINA.ZHS16GBK";

#stty -istrip -parity cs8;

#setenv LANG zh

拟在/sybdata(磁盘阵列)下建立一个目录orabak,用于存放dmp文件。

#mkdir /sybdata/orabak

#chown oracle:oinstall /sybdata/orabak

#su – oracle

#cd /sybdata/orabak

%exp system/manager@hnsdh file=hnsdh_2005-8-17 log=hnsdh_exp_2005-8-17 full=y

(此处命名为示例,以实施当日日期为准)

察看日志结尾,以判定导出是否成功。

#cat hnsdh_2005-8-17.dmp | od -x | head

看第二和第三个字节组成的十六进制数是多少可判断导出文件的字符集。

示例如下

#cat example.dmp | od -x | head

0000000 0303 5445 5850 4f52 543a 5630 392e 3032

。。。

0000220 646d 7000 0000 0000 0000 0000 0000 0000

十六进制的0354化为十进制为852,参造下表

col nls_charset_id for 9999
col nls_charset_name for a30
col hex_id for a20
select
nls_charset_id(value) nls_charset_id, 
value nls_charset_name,
to_char(nls_charset_id(value),'xxxx') hex_id
from  v$nls_valid_values
where parameter = 'CHARACTERSET'
order by nls_charset_id(value)

NLS_CHARSET_ID NLS_CHARSET_NAME HEX_ID

-------------- ------------------------------ -------------

1 US7ASCII 1

2 WE8DEC 2

3 WE8HP 3

4 US8PC437 4

5 WE8EBCDIC37 5

6 WE8EBCDIC500 6

7 WE8EBCDIC1140 7

8 WE8EBCDIC285 8

...................

850 ZHS16CGB231280 352

851 ZHS16MACCGB231280 353

852 ZHS16GBK 354

853 ZHS16DBCS 355

860 ZHT32EUC 35c

861 ZHT32SOPS 35d

862 ZHT16DBT 35e

863 ZHT32TRIS 35f

864 ZHT16DBCS 360

865 ZHT16BIG5 361

866 ZHT16CCDC 362

867 ZHT16MSWIN950 363

868 ZHT16HKSCS 364

870 AL24UTFFSS 366

871 UTF8 367

872 UTFE 368

即可得出这个dmp文件的字符集为ZHS16GBK

10.2 在数据库中直接更改字符集参数

操作步骤如下:

SQL> shutdown immediate

SQL> startup mount

SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;

SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;

SQL> ALTER DATABASE OPEN;

SQL> alter session set events '10046 trace name context forever,level 12';

SQL> alter database character set INTERNAL_USE ZHS16GBK;

SQL> shutdown immediate

SQL> startup

察看系统字符集

SQL> SELECT * FROM NLS_DATABASE_PARAMETERS;

NLS_CHARACTERSET的值为多少,如果为ZHS16GBK则说明改动成功。

如果执行正常,则按照下一节进行测试操作。

10.3 更改成功后的测试

测试1,在数据库服务器端下测试

%setenv NLS_LANG "SIMPLIFIED CHINESE_CHINA.ZHS16GBK";

%stty -istrip -parity cs8;

%setenv LANG zh

%sqlplus /nolog

SQLconn / as sysdba

SQLcreate table test_tq (a char(20));

SQLinsert into test_tq

1>(a)

2>values ('洣洣');

SQLselect * from test_tq;

如显示为

A

--------------------

洣洣

则成功。

测试2Windows客户端环境下测试

REGEDIT,第一步选HKEY_LOCAL_MACHINE,第二步选择SOFTWARE 第三步选择 ORACLE 第四步选择 NLS_LANG 与服 (本例为:AMERICAN_AMERICAN.US7ASCII)

右击我的电脑,然后点击属性,“高级”页面下,点击“环境变量”,在系统变量中添加:

变量名:NLS_LANG

变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK

运行cmd,输入echo %NLS_LANG%,查看系统变量设置时否成功

然后运行:

$sqlplus system/manager@hnsdh

SQLconn / as sysdba

SQLcreate table test_tq (a char(20));

SQLinsert into test_tq

1>(a)

2>values ('洣洣');

SQLselect * from test_tq;

如显示为

A

--------------------

洣洣

则成功。

10.4 更改不成功时的措施

新建数据库,设定字符集为ZHS16GBK,其他参数先照搬原来的,并倒入数据。建库时所需的具体参数在重建之前要搜集。注意在配置控制文件时设定最大数据文件数。

建好数据库以后,执行以下命令即可恢复数据库

%cd /sybdata/orabak

%imp system/manager@hnsdh full=y ignore=y file=hnsdh_2005-8-17 log=hnsdh_imp_2005 -8-17

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14876437/viewspace-591730/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-02-16

  • 博文量
    91
  • 访问量
    45033