Oracle 9i数据库字符集全攻略

一、简介

Oracle 的字符集存在于服务器端和客户端,同时字符(包括中英文字符)存储于数据库中也是以一定的字符集编码存放
正常情况下,当服务器端与客户端字符集一致,且加载到ORACLE数据库的数据字符集与服务器字符集也一致时,数据方能正常在客户端进行显示

1.服务器字符集可用下面的语句查询:
SELECT * FROM V$NLS_PARAMETERS WHERE parameter LIKE '%CHARACTERSET';

2.客户端的字符集在注册表或环境变量中指示:
注册表:运行REGEDIT,HKEY_LOCAL_MACHINE->SOFTWARE->ORACLE->HOME0->NLS_LANG
环境变量:NLS_LANG

3.查看数据库中存放的字符编码(以"中"字为例,16进制方式显示):
SELECT '中',DUMP('中',16) FROM dual;

二、Oracle服务器进行字符集转换的规则

Oracle服务器根据客户端的字符集判断是否需要在服务器端进行转换

1.在做查询操作时
a.如果客户端指定的字符集与服务器端指定的字符集一致,则服务器端不进行转换直接将字符编码传到客户端进行解析显示
b.如果客户端指定的字符集与服务器端指定的字符集不一致,刚服务器端将把字符编码转换为客户端指定的字符集编码再传给客户端进行解析显示

2.在做exp操作时
a.如果客户端指定的字符集与服务器端指定的字符集一致,服务器不进行转换直接转储为dmp文件
b.如果客户端指定的字符集与服务器端指定的字符集不一致,服务器将把数据字符集转换为客户端指定的字符集进行转储

3.在做imp操作进
a.如果转储文件的字符集与服务器端指定的字符集一致,服务器不进行转换直接将转储文件导入到数据库中存放
b.如果转储文件的字符集与服务器端指定的字符集不一致,服务器将把转储文件的字符集转换为服务器端指定的字符集进行存放

三、Oracle 9i服务器字符集修改实例  ZHS16GBK -> AL32UTF8

1.客户端指定为ZHS16GBK字符集,用exp工具将所有用户数据导出为转储文件

2.强制转换字符集,数据库应该在RESTRICTED模式下进行
SQLPLUS "/ AS SYSDBA"
SHUTDOWN IMMEDIATE
STARTUP MOUNT
ALTER SESSION SET SQL_TRACE=TRUE;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;
--INTERNAL_USE 用于跳过子集与超集的检查,如果不加会报错
--ALTER SYSTEM DISABLE RESTRICTED SESSION;
SHUTDOWN IMMEDIATE
STARTUP

3.客户端指定为ZHS16GBK字符集,用imp工具将转储文件导入到数据库中

你可能感兴趣的:(oracle,sql)