Oracle OCP笔记(32)全球化(字符集,语言,地区等)
1.全球化功能
(1).字符集
数据库中存储的数据必须被编码为字符集,字符集是用于将字符表示为位序列的已定义编码模式。
有些软件产品会使用主机操作系统所提供的字符集。如Microsoft Word使用Windows操作系统所提供的字符集。
有些软件产品则提供了自己的字符集,不依赖于主机操作系统所提供的字符集,如Oracle.
ASCII与
Unicode标准用于字符编码的国际标准,包含任何计算机系统需要的所有字符。
单字节(7位) US7ASCII
YUG7ASCII
单字节(8位) WE8ISO8859P15
WE8DEC
I8EBCDIC1144
固定长度多字节 ZHS16GBK: 简体中文,两字节
ZHT16BIG5: 繁体中文,两字节
AL16UTF16: 一种Unicode字符集,两字节
变长单字节 UTF8: 一种Unicode字符集,1~4个字节,Unix系统的标准字符集.
变长多字节 JA16SJIS
ZHT16CCDC: 传统的中文字符集,每个字节的最高位用于指示该字节是单字节字符还是多字节字符的一部分.
AL32UTF8: 可变长的Unicode字符集.
select * from nls_database_parameters where parameter in ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET'); -- 数据库的字符集.
select * from props$ where name in ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET'); -- 数据库的字符集.
select * from v$nls_valid_values where parameter='CHARACTERSET'; -- 支持的所有字符集
(2).语言支持
关于语言的初始化参数
nls_language -- 语言,显示错误消息的语言,默认值AMERICAN
nls_date_language -- 用于日期与月份名的语言,默认值AMERICAN
nls_sort -- 语言排序顺序,默认值BINARY
select * from nls_database_parameters where parameter in ('NLS_LANGUAGE','NLS_DATE_LANGUAGE','NLS_SORT'); -- 数据库中设置的语言
select * from nls_instance_parameters where parameter in ('NLS_LANGUAGE','NLS_DATE_LANGUAGE','NLS_SORT'); -- 实例中设置的语言
select * from nls_session_parameters where parameter in ('NLS_LANGUAGE','NLS_DATE_LANGUAGE','NLS_SORT'); -- 会话级设置的语言
select * from props$ where name in ('NLS_LANGUAGE','NLS_DATE_LANGUAGE','NLS_SORT'); -- 数据库中设置的语言
select * from v$parameter where name in ('nls_language','nls_date_language','nls_sort'); -- 实例中设置的语言
select * from v$nls_parameters where parameter in ('NLS_LANGUAGE','NLS_DATE_LANGUAGE','NLS_SORT'); -- 会话级设置的语言
select * from v$nls_valid_values where parameter='LANGUAGE'; -- 支持的所有语言
select * from v$nls_valid_values where parameter='SORT'; -- 支持的所有排序顺序
alter session set nls_language='AMERICAN'; -- 设置会话级的语言
(3).地区支持
关于地区及相关的初始化参数
nls_territory -- 地区,地理位置,默认值AMERICA
nls_currency -- 当地货币符号,默认值$
nls_dual_currency -- 次要货币符号,默认值$
nls_iso_currency -- 指示ISO地区货币符号,默认值AMERICA
nls_date_format -- DATE类型列格式,默认值DD-MM-RR
nls_numeric_characters -- 小数点分隔符与组分隔符,默认值.,
nls_timestamp_format -- TIMESTAMP类型列格式,默认值DD-MM-RRHH.MI.SSXFF AM
nls_timestamp_tz_format -- TIMESTAMP WITH LOCAL TIMEZONE类型列格式,默认值DD-MM-RRHH.MI.SSXFF AM TZR
select * from nls_database_parameters where parameter = 'NLS_TERRITORY'; -- 数据库中设置的地区
select * from nls_instance_parameters where parameter = 'NLS_TERRITORY'; -- 实例中设置的地区
select * from nls_session_parameters where parameter = 'NLS_TERRITORY'; -- 会话级设置的地区
select * from props$ where name = 'NLS_TERRITORY'; -- 数据库中设置的地区
select * from v$parameter where name='nls_territory'; -- 实例中设置的地区
select * from v$nls_parameters where parameter = 'NLS_TERRITORY'; -- 会话级设置的地区
select * from v$nls_valid_values where parameter='TERRITORY'; -- 支持的所有地区
地区选择还可以默认设置日和周的编号、收支符号、日期格式、小数点分隔符和组分隔符以及货币符号。
alter session set nls_territory='AMERICA';
select systimestamp from dual; -- 时间戳格式
alter session set nls_date_format='dd-mm-yyyy';
select sysdate from dual; -- 日期格式
(4).其他NLS设置
nls_calendar -- 允许使用另一种历法系统(Gregorian)
nls_comp -- 使用字母的NLS值进行ANSI比较(BINARY)
nls_length_semantics -- 允许将多字节字符作为完整的字符(而非字节)进行操纵(BYTE)
nls_nchar_conv_excp -- 限制在VARCHAR2与NVARCHAR之间进行转换时生成的错误信息(FALSE)
2.使用全球化支持功能
可以在以下5个级别任意级别上或所有级别上指定全球化(优先级别由低到高):
数据库
实例
客户端环境
会话
语句
(1).选择字符集:
在数据库创建阶段,必须正确完成的两个设置: db_block_size参数和数据库字符集。
db_block_size参数绝对不能改变,数据库字符集理论上可以改变,但事实上不可行。
数据库VARCHAR2、CLOB、CHAR和LONG列使用数据库字符集存储。NVARCHAR2、NCLOB和NCHAR列使用National Character Set存储。
National Character Set只能为Unicode字符集: AL16UTF16和UTF8.
(2).改变数据库字符集
csscan: 数据库字符集扫描程序(Database Character Set Scanner)
lcsscan: 语言与字符集文件扫描程序(Language and Character Set File Scanner)
csscan system/password full=y tochar=utf8 -- 查看转换致utf8是否会导致任何问题,必须先运行csminst.sql脚本.
alter database character set ZHS16GBK;
alter database national character set AL16UTF16;
目标字符集必须是原始字符集的一个超集.
(3).数据库级的全球化
select * from nls_database_parameters; -- 数据库级的全球化设置
select * from props$; -- 数据库级的全球化设置
alter system set nls_language='AMERICAN' scope=spfile;
(4).实例级的全球化
select * from nls_instance_parameters; -- 实例级的全球化设置
select * from v$parameter where name like 'nls%'; -- 实例级的全球化设置
alter system set nls_language='AMERICAN' scope=spfile; -- 设置实例级的语言
实例参数设置会重写数据库设置。在RAC环境中,不同的实例可以具有不同的设置。
(5).客户端环境设置
某个Oracle用户进程启动时,这个进程会通过查看其运行的环境获得全球化的默认设置。这种机制意味着用户可以使用不同的全球化设置来配置与各自要求相适应的终端。这个功能的内部实现为:用户进程读取环境变量,随后生成一系列实现该机制的alter session命令。
服务器端与客户端的全球化设置之间的转换由Oracle Net完成。
环境变量: NLS_LANG=语言_地区.字符集(<Language>_<Territory>.<Characterset>)
NLS_DATE_FORMAT
导出导入操作(Export/Import)可能需要设置NLS_LANG环境变量.
Linux平台的Oracle:
$ echo $NLS_LANG
$ export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK -- 客户端环境变量
$ export NLS_DATE_FORMAT='MM/DD/YYYY';
修改配置文件永久生效
$ vi .bash_profile
NLS_LANG="SIMPLIFIED CHINESE_CHINA".ZHS16GBK; export NLS_LANG;
NLS_DATE_FORMAT='MM/DD/YYYY'; export NLS_DATE_FORMAT;
$ source .bash_profile
Windows平台的Oracle:
C:\> echo %NLS_LANG%
C:\> set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
C:\> set NLS_DATE_FORMAT='MM/DD/YYYY'
修改注册表永久生效
HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/HOME0/NLS_LANG
图形界面客户端软件显示的语言,依赖于操作系统的环境变量LANG
$ export LANG=zh_CN.UTF-8
$ export LANG=zh_CN.GBK
$ export LANG=en_US.UTF-8
或者修改文件/etc/sysconfig/i18n的LANG环境变量
(6).会话级全球化设置
select * from nls_session_parameters; -- 会话级别的全球化设置
select * from v$nls_parameters; -- 会话级别的全球化设置
-- 修改会话级别的全球化设置.
alter session set nls_language='AMERICAN';
alter session set nls_date_format='mm/dd/yyyy';
execute dbms_session.set_nls('nls_date_format','''mm/dd/yyyy''');
(7).语句级的全球化设置
可以在SQL语句内使用NLS参数,此SQL函数是能够在数据类型之间进行转换的类型强制转换函数
TO_DATE: NLS_DATE_LANGUAGE
NLS_CALENDAR
TO_NUMBER: NLS_NUMERIC_CHARACTERS
NLS_CURRENCY
NLS_DUAL_CURRENCY
NLS_ISO_CURRENCY
NLS_CALENDAR
TO_CHAR,TO_NCHAR: NSL_DATE_LANGUAGE
NLS_NUMERIC_CHARACTERS
NLS_CURRENCY
NLS_DUAL_CURRENCY
NLS_ISO_CURRENCY
NLS_CALENDAR
select to_char(sysdate,'month','NLS_DATE_LANGUAGE=AMERICAN') from dual;
(8).语言排序选择
alter session set nls_sort=generic_baseletter;
alter session set nls_comp=ansi;
(9).自定义全球化环境
Locale Builder: %ORACLE_HOME/nls/lbuilder/lbuilder
(10).使用时区
带时区的时间戳类型:
TIMESTAMP WITH TIME ZONE -- 存储时不规范化为数据库时区,但有指示符指示引用的时区
TIMESTAMP WITH LOCAL TIME ZONE -- 存储时规范化为数据库时区,检索时转换为客户端的时区
普通的DATE和TIMESTAMP数据类型在存储时始终会规范化为数据库时区,并在选中时原样显示
select dbtimezone from dual; -- 数据库时区
select sessiontimezone from dual; -- 客户端会话时区
select * from database_properties where property_name = 'DBTIMEZONE'; -- 数据库时区
select to_char(systimestamp,'yyyy/mm/dd hh24:mi:ss tzr') from dual; -- 带时区的时间戳
select * from v$timezone_names; -- 支持的所有时区
alter database set time_zone='+08:00';
alter session set time_zone='Asia/Shanghai';
alter session set nls_timestamp_tz_format='yyyy/mm/dd hh24:mi:ss tzr';
ORA_STDZ环境变量设置客户端时区.