> 데이터 베이스 > MySQL 튜토리얼 > Oracle字符集(一)

Oracle字符集(一)

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
풀어 주다: 2016-06-07 15:46:06
원래의
1036명이 탐색했습니다.

1.1 选择字符集的原因: 由于ASCII字符编码定义了128个字符,而且只有95个可显示字符,这是远远不够的,如果oracle需要存放多种国家的字符,那么建议使用unidoce编码。如果只是为了显示中文,那么就只需要选择合适的编码了,这样可以减少没用的网络传输(utf

1.1 选择字符集的原因:

由于ASCII字符编码定义了128个字符,而且只有95个可显示字符,这是远远不够的,如果oracle需要存放多种国家的字符,那么建议使用unidoce编码。如果只是为了显示中文,那么就只需要选择合适的编码了,这样可以减少没用的网络传输(utf8实际采用了2-4个字节!!)。

1.2 选择字符集

创建数据库时需要选择两种字符集:

字符集:主要用来存储char,varchar2等数据类型;标识表名,列名,pl/sql变量;存储sql和pl/sql代码等;

国家字符集:用来存放nchar,nvarchar2,nclob等类类型。

字符集选择后,可以容纳的字符就确定了,在进行字符集转换时候需要注意,目的字符集是否是源字符集的超集。需要

意的是,GBK并不是GB2312严格意义上的超集。虽然GB2312表示的字符在GBK中就存在,但是同样的编码在这两个字符集中可能表达不同的汉字

字符集命名法:,如ZHS16GBK

1.3 字符集文件和字符支持

Oracle服务器端(通常在目录$ORACLE_HOME/nls/data)存放了三类文件分别用来定义语言(nls_lang),区域(nls_terroitory),字符集(nls_characterset).其中中文语言文件是lx00023.nlb。语言字符集往往与客户端显示相关,通常NLS_LANG可以设置客户端的显示方式。常用信息比如星期,月份,时间都可以由这个文件控制显示

中文字符集(ZHS16GBK)文件是LX20354.NLB。通过这个字符集文件oracle就建立了每个汉字和16 bits编码的对应关系了。

查看当前数据库使用的字符集:

SYS > select name,value$ from props$ where name='NLS_CHARACTERSET'; 

NAME                          |VALUE$

------------------------------|------------------------------

NLS_CHARACTERSET              |ZHS16GBK

查看某个汉字的字符编码:

SQL> select dump('刘') from dual;  

DUMP('刘')

---------------------

Typ=96 Len=2: 193,245

SQL> select to_number('c1F5','xxxx') from dual; 

TO_NUMBER(' c1F5','XXXX')

-------------------------------------

                49653

两个字节可以表示65536个字符,查看某个十进制数表示的字符:

SQL> select chr(49653) from dual;

CH

--

1.4 客户端字符集支持

客户端设置了字符集,但是自己没有字符集文件,也是没法启动sqlplus的,如果把客户端设置为

C:\Users\HuangXing>set nls_lang=american_america.zhs16gbk

那么结果:show parameter:

SYS >show parameter nls

NAME                                |TYPE       |VALUE

------------------------------------|-----------|------------------------------

nls_calendar                        |string     |GREGORIAN

nls_comp                            |string     |BINARY

nls_currency                        |string     |$

nls_date_format                     |string     |yyyy-mm-dd hh24:mi:ss

nls_date_language                   |string     |AMERICAN

nls_dual_currency                   |string     |$

nls_iso_currency                    |string     |AMERICA

nls_language                        |string     |AMERICAN

nls_length_semantics                |string     |BYTE

nls_nchar_conv_excp                 |string     |FALSE

nls_numeric_characters              |string     |.,

nls_sort                            |string     |BINARY

nls_territory                       |string     |AMERICA

nls_time_format                     |string     |HH.MI.SSXFF AM

nls_time_tz_format                  |string     |HH.MI.SSXFF AM TZR

nls_timestamp_format                |string     |DD-MON-RR HH.MI.SSXFF AM

nls_timestamp_tz_format             |string     |DD-MON-RR HH.MI.SSXFF AM TZR

Show parameter 结果中有的参数的值由客户端决定,本例即时如此。NLS_LANG格式为:

NlLS_LANG=_.,lang指定oracle提示消息使用的语言,territory指定地区,星期,日期,货币等的显示方式,characterset用于对服务器端传过来的数据进行解码。本例由于客户端字符集是ZHS16GBK,那么仍然使用lx20354.nlb进行解码

1.5 实验:移除了字符集文件,导致数据库无法启动

bash-4.1$ mv lx20354.nlb  lx20354.nlb.bak

Oracle字符集(一)

修改客户端nls_lang环境变量,用sysdba登录成功,但是启动数据库时仍报错:

bash-4.1$ NLS_LANG=AMERICAN_AMERICA.US7ASCII

bash-4.1$ sqlplus  / as sysdba              

SQL*Plus: Release 11.2.0.3.0 Production on Sat Apr 6 21:58:17 2013

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> STARTUP;

ORACLE instance started.

Total System Global Area  217120768 bytes

Fixed Size                  2227016 bytes

Variable Size             125830328 bytes

Database Buffers           83886080 bytes

Redo Buffers                5177344 bytes

ORA-12709: error while loading create database character set

修改了nls_lang环境变量,只是表明sqlplus可以根据新的环境变量进行客户端初始化,但是在启动数据库时候,还是会读取字符集文件,所以启动失败,而且无法执行各种sql语句。可以追踪这个过程:

Oracle字符集(一)

如果在客户端删除了这个文件,改变nls参数,可以远程登录数据库,但是查看中文字符会出现?(表示无法解析的字符),这是客户端解析错误所致:

Oracle字符集(一)

结论,字符集文件是sqlplus和oracle软件必须的。

1.3 修改字符集:

SQL> alter database character set zhs16cgb231280;

alter database character set zhs16cgb231280

*

ERROR at line 1:

ORA-12712: 新字符集必须为旧字符集的超集


STARTUP MOUNT;

ALTER SESSION SET SQL_TRACE=TRUE;

ALTER SYSTEM ENABLE RESTRICTED SESSION;

SQL> show parameter JOB_QUEUE_PROCESSES;


NAME     TYPE

------------------------------------ ---------------------------------

VALUE

------------------------------

job_queue_processes     integer

1000

SQL> show parameter AQ_TM_PROCESSES;


NAME     TYPE

------------------------------------ ---------------------------------

VALUE

------------------------------

aq_tm_processes     integer

1


ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

ALTER SYSTEM SET AQ_TM_PROCESSES=0;

ALTER DATABASE OPEN;

--ALTER DATABASE CHARACTER SET AL32UTF8;

--跳过子集超集检验步骤如下:

ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;

SHUTDOWN IMMEDIATE;

STARTUP



원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿