全球化支持
让数据库适应不同地区的人的需求
需求包括
字符集
排序
日期时间格式
货币符号
等等
为了让系统有更好的适用性 采用了数据库字符集和国家字符集
数据库字符集 国家字符集
varchar2 nvarchar2
unicode 效率差
比如一个AU16字符集的8K块放150行数据 使用unicode可能只放100行 这样读数据的效率下降了
比如一个姓名是中文 另一列是其他语言时 都采用同一个数据库字符集 存储上就不够合理
N 就可以很好的解决这些问题 将一个表中某列的数据类型定义成基本的 另一列为N的
NLS 国家语言支持
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 AMERICAN 语言
nls_length_semantics string BYTE
nls_nchar_conv_excp string FALSE
nls_numeric_characters string
nls_sort string
nls_territory string AMERICA 地区 影响时区,货币符号,日期格式,排序格式等
nls_time_format string
nls_time_tz_format string
nls_timestamp_format string
nls_timestamp_tz_format string
SQL>
nls_language 和 nls_territory的值设置最重要
其他参数受这两个参数影响都会有默认值
可以在参数级,客户端环境变量级,会话级,sql函数级
设置的优先级别
低端 参数级==> 客户端环境变量级 ==> 会话级 ==> sql函数级 高端
数据库级的设置 在安装数据时设置 设置后不要再更改
参数级
SQL> select * from nls_database_parameters;
PARAMETER VALUE
------------------------------ ------------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET AL32UTF8
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.1.0
20 rows selected.
SQL>
客户端环境变量级
设置后 登录服务器时 就会覆盖服务器内的值
vim .bash_profile
NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
NLS_LANG=AMERICAN_AMERICA.AL32UTF8
:wq
SQL> select to_char(sal,'L999,999.00') from scott.emp where deptno=10;
TO_CHAR(SAL,'L999,999
---------------------
$2,460.00
$5,010.00
$1,310.00
SQL>
vim .bash_profile
NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
NLS_LANG=AMERICAN_CHINA.AL32UTF8
:wq
SQL> select to_char(sal,'L999,999.00') from scott.emp where deptno=10;
TO_CHAR(SAL,'L999,999
---------------------
¥2,460.00
¥5,010.00
¥1,310.00
SQL>
vim .bash_profile
NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
NLS_LANG="SIMPLIFIED CHINESE"_CHINA.AL32UTF8
:wq
SQL> select sysdate from dual;
SYSDATE
-------------------
2011-04-03 23:52:47
SQL> alter session set nls_date_format='dd-mon-rr';
会话已更改。
SQL> select sysdate from dual;
SYSDATE
--------------
03-4月 -11
SQL>
客户端字符集设置和数据库存储的字符集不一致 会导致显示乱码
SQL> drop table t1 purge;
表已删除。
SQL> create table t1 (x char(20));
表已创建。
SQL> insert into t1 values('你好');
已创建 1 行。
SQL> select * from t1;
X
--------------------
你好
SQL> select dump(x) from t1;
DUMP(X)
----------------------------------------------------------------------------------------------------
Typ=96 Len=20: 228,189,160,229,165,189,32,32,32,32,32,32,32,32,32,32,32,32,32,32
SQL> exit
[oracle@dba ~]$ export NLS_LANG=AMERICAN_AMERICA.US7ASCII
SQL> conn / as sysdba
Connected.
SQL> select * from t1;
X
--------------------
??
SQL>
会话级别设置
只保持在当前会话有效 比客户端级别高
SQL> select sysdate from dual;
SYSDATE
-------------------
2011-04-03 22:53:46
SQL> alter session set nls_date_format='dd-mon-rr';
Session altered.
SQL> select sysdate from dual;
SYSDATE
------------------
03-apr-11
SQL>
sql转换函数语句级
SQL> select to_char(sysdate,'yyyy-mm-dd') from dual;
TO_CHAR(SY
----------
2011-04-03
SQL>
字符集的排序影响
排序的三种类型
binary sorting
monolingual linguistic sorting
multiling
SQL> show parameter nls_sort
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_sort string
SQL> select * from nls_database_parameters where parameter = 'NLS_SORT';
PARAMETER VALUE
------------------------------ ------------------------------
NLS_SORT BINARY
SQL> show parameter nls_sort
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_sort string
SQL>
1、使用拼音排序
select * from t order by nlssort(field,'NLS_SORT=SCHINESE_PINYIN_M');
2、使用笔画排序
select * from t order by nlssort(field,'NLS_SORT=SCHINESE_STROKE_M');
3、使用偏旁部首排序
select * from t order by nlssort(field,'NLS_SORT=SCHINESE_RADICAL_M');
创建索引时指定排序方法
create index list_word on list(NLSSORT(WORD,'NLS_SORT='))
SQL> SHOW PARAMETER NLS_SORT
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_sort string
SQL> select value from nls_database_parameters where parameter='NLS_SORT';
VALUE
-----------------------------------
BINARY
SQL> select value from nls_session_parameters where parameter='NLS_SORT';
VALUE
-----------------------------------
BINARY
SQL>
可以使用 alter system ; alter session修改
可以使用语句级排序
SQL> select * from t11 order by v;
V
----------
不
才
的
阿
SQL> select * from t11 order by nlssort(v,'NLS_SORT=SCHINESE_PINYIN_M');
V
----------
阿
不
才
的
SQL> select * from t11 order by nlssort(v,'NLS_SORT=SCHINESE_STROKE_M');
V
----------
才
不
阿
的
SQL> select * from t11 order by nlssort(v,'NLS_SORT=SCHINESE_radical_M');
V
----------
不
才
的
阿
数据泵导入导出时 不需要关系字符集问题 因为导出文件是本地的
传统导入导出文件 要关注字符集问题 因为导出到客户端
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24756465/viewspace-717791/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/24756465/viewspace-717791/