今天一个朋友问到这个问题,发现不同的建库方式对数据库级参数的影响是不同的。
语言的设置分为3个级别:数据库级、实例级和会话级。
数据库级是在数据库创建时确定的,实例级根据数据库启动时初始化参数来确定,而会话级在会话建立的时候确定,且在会话中可以随时改变。
对于使用DBCA来建立的数据库,根据建库时选项的不同,得到的数据库级设置也是不相同的。
如果在建立数据库的时候选择CUSTOM,即定制数据库的方式,且在初始化参数的设置页面,字符集子页面中选择ZHS16GBK字符集,国家字符集选择AL16UTF16国家字符集,默认语言选择简体中文,默认日期格式选择中国,那么安装之后得到的数据库,实例级和数据库级设置分别为:
SQL> SHOW PARAMETER NLS
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_calendar string
nls_comp string
nls_currency string
nls_date_format string
nls_date_language string
nls_dual_currency string
nls_iso_currency string
nls_language string SIMPLIFIED CHINESE
nls_length_semantics string BYTE
nls_nchar_conv_excp string FALSE
nls_numeric_characters string
nls_sort string
nls_territory string CHINA
nls_time_format string
nls_time_tz_format string
nls_timestamp_format string
nls_timestamp_tz_format string
SQL> SELECT NAME, VALUE$
2 FROM PROPS$
3 WHERE NAME LIKE 'NLS%';
NAME VALUE$
------------------------------ --------------------------------------------------
NLS_LANGUAGE SIMPLIFIED CHINESE
NLS_TERRITORY CHINA
NLS_CURRENCY ?
NLS_ISO_CURRENCY CHINA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET ZHS16GBK
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE SIMPLIFIED CHINESE
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY ?
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_RDBMS_VERSION 10.2.0.3.0
已选择20行。
而如果在建立数据库的时候选择GENERATE,即一般数据库用途,其他选择不变,即初始化参数的设置页面,字符集子页面中选择ZHS16GBK字符集,国家字符集选择AL16UTF16国家字符集,默认语言选择简体中文,默认日期格式选择中国,那么安装之后得到的数据库,实例级和数据库级设置分别为:
SQL> SHOW PARAMETER NLS
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_calendar string
nls_comp string
nls_currency string
nls_date_format string
nls_date_language string
nls_dual_currency string
nls_iso_currency string
nls_language string SIMPLIFIED CHINESE
nls_length_semantics string BYTE
nls_nchar_conv_excp string FALSE
nls_numeric_characters string
nls_sort string
nls_territory string CHINA
nls_time_format string
nls_time_tz_format string
nls_timestamp_format string
nls_timestamp_tz_format string
SQL> SELECT NAME, VALUE$
2 FROM PROPS$
3 WHERE NAME LIKE 'NLS%';
NAME VALUE$
------------------------------ -------------------------------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET ZHS16GBK
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_RDBMS_VERSION 10.2.0.3.0
已选择20行。
可以看到,两种方法的初始化参数是一致的,也就是实例级的设置是一致的,但是数据库级设置是不同的。
这时由于GENERATE方式,Oracle采用了已有的数据文件拷贝的方式,通过这种方式实际上数据库是一个已经建好的数据库,而数据库一旦建立成功,数据库级的参数设置也就确定了,在随后的安装过程中,Oracle只是修改了实例级的设置,而不会修改已经存在的数据库级的设置。