我们在ORACLE数据库中常见的两种字符集:AL32UTF8/ZHS16GBK
什么是字符集:
在计算机语言中每个国家对于自己国家语言的二进制代码设计是不一样的,例如:
zhs16gbk 简体中文字符集 :中 01010 国 01100 0101001100
utf8 A 010 B 100 C 110 ABC 010001110
0101001100 ABC
乱码
字符集是在创建数据库时选择的。请选择最能满足您现在和将来业务需要的字符集,因为选定字符集后很难再更改。
很难再更改=改不了 非要修改 只能删库重建
DBA在建库之间 数据库叫什么 用什么字符集
查询操作系统字符集:
locale ( unix or linux)
chcp (windows)
查询数据库所支持的数据库字符集:
select * from v$nls_valid_values where parameter='CHARACTERSET';
数据库服务器字符集select * from nls_database_parameters where parameter like '%CHARACTERSET%'; 其来源于props$,是表示数据库的字符集。
客户端字符集环境 select * from v$nls_parameters where parameter in ( 'NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET'); --查看客户端字符集
表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表
会话字符集环境 select * from nls_session_parameters; ,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters一致。
影响Oracle数据库字符集最重要的参数是NLS_LANG参数。
它的格式如下: NLS_LANG = language_territory.charset
它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。
其中:
Language: 指定服务器消息的语言, 影响提示信息是中文还是英文
Territory: 指定服务器的日期和数字格式
Charset: 指定字符集。
如:AMERICAN _ AMERICA. ZHS16GBK
从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。
set NLS_LANG=AMERICAN_CHINA.ZHS16GBK
set NLS_LANG=Simplified Chinese_china.ZHS16GBK
echo $NLS_LANG$ 查看当前的操作系统的环境变量的字符集设置
修改当前会话的字符集: export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
当前数据库使用的字符集:
SQL> select * from nls_database_parameters where parameter like '%CHARACTERSET%';--当前数据库使用的字符集
select * from v$nls_parameters where parameter in ( 'NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET'); --查看客户端字符集
ALTER SESSION SET NLS_LANGUAGE= 'SIMPLIFIED CHINESE' NLS_TERRITORY= 'CHINA' NLS_NUMERIC_CHARACTERS='AL32UTF8';
alter session set NLS_NUMERIC_CHARACTERS= '.,';
###########################################################################
set NLS_LANG=AMERICAN_AMERICA.AL32UTF8 windows上设置 set NLS_LANG=AMERICAN_AMERICA.ZHS16CGB231280
select id,name,dump(name,1016) from t;
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
set NLS_LANG=AMERICAN_AMERICA.ZHS16CGB231280
set NLS_LANG=AMERICAN_AMERICA.US7ASCII
set NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16CGB231280"
set NLS_LANG=AMERICAN_AMERICA.AL32UTF8
set nls_lang=Simplified Chinese_China.AL32UTF8
#####################################################################################
如果想正确导出源数据库数据,则 Export 过程中用户会话字符集应等于源
数据库字符集或是源数据库字符集的超集
查询 oracle client 端的字符集:
在 windows 平台下,就是注册表里面相应 OracleHome 的 NLS_LANG。还可
以在 dos 窗口里面自己设置,
比如: set nls_lang=AMERICAN_AMERICA.ZHS16GBK
这样就只影响这个窗口里面的环境变量。
在 unix 平台下,就是环境变量 NLS_LANG。
$echo $NLS_LANG
AMERICAN_AMERICA.ZHS16GBK
如果检查的结果发现 server 端与 client 端字符集不一致,请统一修改为同
server 端相同的字符集。