oracle031
字符集:就是一张字符和编码的对应表。
1、字符集的作用和含义
字符编码
使用场合
数据库字符集
(1)用来存储CHAR, VARCHAR2, CLOB, LONG等类型数据
(2)用来标示诸如表名、列名以及PL/SQL变量等
(3)用来存储SQL和PL/SQL程序单元等
国家字符集
(1)用以存储NCHAR, NVARCHAR2, NCLOB等类型数据
2、客户端OS字符集、NLS_LANG设置、服务器端OS字符集、Oracle数据库字符集
字符集之间的关系
正确设置字符集
3、字符集出现问题以后的判断流程
存储的是错误的字符编码
存储的是正确的字符编码
4、locale、locale -a、chcp
5、字符集命名
Oracle的字符集命名遵循以下命名规则:
<Language><bit size><encoding>
即: <语言><比特位数><编码>
比如: ZHS16GBK表示采用GBK编码格式、16位(两个字节)简体中文字符集
US7ASCII //美国人选择的字符集,只能是美国使用的字符不超过128个
zhs16cgb231280//中国人使用的字符集,存储中国部分字符
AL32UTF8//oracle数据库字符集
AF16UTF16//oracle选择国家字符集
ZHS16GBK//中国使用的字符集,是包括所有中国字符,是zhs16chb231280的超集,不是严格超集
utf8//
超集 严格超集
NLS_LANG=<language>_<territory>.<client character set>
Language:显示oracle消息,校验,日期命名
Territory:指定默认日期、数字、货币等格式
Client character set:指定客户端将使用的字符集
例如:NLS_LANG=AMERICAN_AMERICA.US7ASCII
AMERICAN是语言就是登录到数据库后,数据库自身所提示的信息是那种语言不是字符编码;
AMERICA是地区表示不同地区所显示信息不同比如说时区、货币等;
US7ASCII是客户端字符集
Oracle提供若干NLS参数定制数据库和用户机以适应本地格式,例如有NLS_LANGUAGE,NLS_DATE_FORMAT,NLS_CALENDER等,可以通过查询以下数据字典或v$视图查看。
NLS_DATABASE_PARAMETERS--显示数据库当前NLS参数取值,包括数据库字符集取值
NLS_SESSION_PARAMETERS--显示由NLS_LANG 设置的参数,或经过alter session 改变后的参数值(不包括由NLS_LANG 设置的客户端字符集)
NLS_INSTANCE_PARAMETE--显示由参数文件init<SID>.ora 定义的参数V$NLS_PARAMETERS--显示数据库当前NLS参数取值
select * from nls_session_parameters
NLS_LANGUAGE SIMPLIFIED CHINESE
NLS_TERRITORY CHINA
NLS_CURRENCY ¥
NLS_ISO_CURRENCY CHINA
NLS_NUMERIC_CHARACTERS .,
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 |
select * from nls_database_parameters
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 11.2.0.1.0 |
select userenv(‘language‘) from dual;//查询客户端的
USERENV(‘LANGUAGE‘)
----------------------------------------------------
AMERICAN_AMERICA.ZHS16GBK |
select nls_charset_name(to_number(‘0354‘,‘xxxx‘)) from dual;
NLS_CHARSET_NAME(TO_NUMBER(‘0354‘,‘XXXX‘
----------------------------------------
ZHS16GBK |
echo $NLS_LANG
SQL> !echo $NLS_LANG
american_america.zhs16gbk |
select to_char(nls_charset_id(‘ZHS16GBK‘), ‘xxxx‘) from dual;
select dump(‘abc‘,1016) from dual;
DUMP(‘ABC‘,1016)
--------------------------------------------
Typ=96 Len=3 CharacterSet=ZHS16GBK: 61,62,63
SQL> |
select * from V$NLS_VALID_VALUES;//
This view lists all valid values for NLS parameters.
如果软件有字符集,那么系统的字符集就会失效;假如软件不带字符集,那么久使用操作系统的字符集
oracle的所有字符集转换都是在oracle端转换的
oracle接受的都是已经编号码的字符
oracle存储的都是oracle数据库的编码格式存储的
oracle需要在编码之前询问传来的端使用什么编码的,假如相同就直接存储,不同就转码而客户端只编码
NLS_LANG参数要和客户端操作系统的字符集一致。NLS_LANG相当于于oracle打交道的
sql developer和sqlplus一样没有字符集