1、字符集命名
Oracle的字符集命名遵循以下命名规则:
<Language><bit size><encoding>
即: <语言><比特位数><编码>
比如: ZHS16GBK表示采用GBK编码格式、16位(两个字节)简体中文字符集
例如:AL32UTF8(其中AL代表ALL,指适用于所有语言)
NLS_LANG=CHINESE_CHINA.ZHS16GBK
CHINESE是语言,CHINA是地区,ZHS16GBK 是客户端字符集
NLS_CHARACTERSET是数据库字符集,
NLS_NCHAR_CHARACTERSET是国家字符集
ORACLE中有两大类字符型数据:
VARCHAR2是按照数据库字符集来存储数据;
NVARCHAR2是按照国家字符集存储数据的;
同样,CHAR和NCHAR也一样,一是数据库字符符,一是国家字符集。
字符集不同,二进制码的组合就不同。
2、三种字符集说明
(1).oracle服务器端字符集:
数据库字符集在创建数据库时指定,在创建后通常不能更改
服务器端字符集的命令是: select * from nls_database_parameters
nls_database_parameters取值与props$,
即我们创建数据库时存储在数据库中的熟悉信息,这与环境变量和参数文件等是统统没有关系的。
(2).oracle客户端字符集:
客户端的字符集的设置,可能是参数文件,环境变量或者是注册表
客户端字符集的命令是: select * from nls_instance_parameters
nls_instance_parameters取值与v$parameter
nls_instance_parameters的值由参数文件决定,那么会不会受到环境变量的影响呢?经验证,是不会的!
(3).oracle会话字符集:
会话字符集是继承客户端字符集,如果设置环境变量可以覆盖会话字符集
会话字符集的命令是: select * from nls_session_parameters
nls_session_parameters 来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,
如果会话没有特殊的设置,将与nls_instance_parameters一致。
总结:
客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。
如果多个设置存在的时候,NLS作用优先级别:Sql function > alter session > 环境变量或注册表 > 参数文件 > 数据库默认参数
字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。
3、修改字符集方法
3.1 修改server端字符集(不建议使用)
1. 关闭数据库
SQL>SHUTDOWN IMMEDIATE
2. 启动到Mount
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 DATABASE CHARACTER SET ZHS16GBK;
SQL>ALTER DATABASE NATIONAL CHARACTER SET AL16UTF16;
--如果是从子集到父集,需要使用INTERNAL_USE 参数,跳过超子集检测
SQL>ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;
SQL>ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE AL16UTF16;
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP
3.2客户端字符集设置方法
1)UNIX环境
$NLS_LANG=“simplified chinese”_china.zhs16gbk
$export NLS_LANG
编辑oracle用户的profile文件
2)Windows环境
编辑注册表
Regedit.exe ---》 HKEY_LOCAL_MACHINE ---》SOFTWARE ---》 ORACLE--》HOME
或者在窗口设置:
set nls_lang=AMERICAN_AMERICA.ZHS16GBK