ocp

来源:互联网 发布:知乎收藏夹 rss 编辑:程序博客网 时间:2024/04/26 13:03

全球化支持

要汉字显示正确,只需要保证数据库的字符集和客户端的字符集一致即可,必不需要数据库字符集一定是汉字字符集.

  1. 字符集:决定了数据库所支持的语言标准
    1. 注:数据库中存储的字符语言与OS无关
  2. 2字符集命令
    1. 语言 位数 编码
    2. US  7 ASCII
    3. ZHS 16 GBK
    4. aL 32 utf8  (alL指所有语言)
  3. 3编码
    1. 1字节
      1. 7位于  US7 ASCII
      2. 8位  ISO-8859-1或WE8 ISO 8859P1
    2. 2宽度可变多字节
      1. AL32UTF8
      2. ZHS16CGB2312
    3.  3宽度固定的多字节(通常用于国家字符集)
      1. AL 16 UTF16
  4. ORACLE对汉字编码的支持
    1. 版本                                                     支持的字符集                                  默认的字符集
    2. ORACLE 7.3                                      ZHS16C/GB231280                      zhs16gbk
    3. ORACLE 8,8I,9I,10G,11G               zhs16cgb2312-80/zhs16gbk       zhs16gbk
  5. 国家字符集和数据字符集
    1. 国家字符集用手存储NCHAR,NVARCHAR2,NCLOBO类型的数据
      1. 带N开头表示无符号的。
      2. 主要用于货币和日期格式。
      3. 在创建数据库的时候指定,可以被改变但不建议。
      4. 建常使用默认AL16UTF16
    2. 数据库字符集(也称为核心字符集)。主要用于存储CHAR,VARCHAR2,CLOB,LOG类型的数据(列名,表名等,PL/SQL的变量及程序等)
      1. 在创建DB时定义,
      2. 不可以被修改,一修改就会数据库变乱码(除非特殊情况)
  6.   客户端的字符集的设置
    1. 需要设置环境变量NLS_LANG
    2. 要求NLS_LANG设置的字符集=数据库的字符集
    3. NLS——LANG的格式   <语言>_<区域>.<核心字符集>
  7. 实例:
  8.   修改核心字符集
    1. 可以修改系统表(字典表)PROPs$表,NAME列中的NLS_CHARACTERSET

常见问题

导出数据:导出数据时,数据库会使用客户端的字符集(而不是数据库字符集)出导入,所以如果客户端字符集不同于数据库字符集时。数据被导出来时字符集就已经变改变,即使再导回同一台机的同一个数据库也会产生乱码。这时需要在导出的时候设置客户端的字符集跟数据库字符集相同(设置nls_lang值)

导入数据

要求以下三者的编码必需一致,任意一个不一致都会乱码

  • 导入的DMP文件的编码
    • 查询:
    • 查询该文件的第2,第3字节的16进制编码
    • NLS_CHARSET_NAME(),SELECT NLS_CHARSET_NAME(TO_NUMBER('0354','XXXX')) FROM DUAL;
  • 客户端NLS——LANG设置的编码
  • 数据库的核心字符集编码
    • 查询:select userenv('language') from dual;

E:/Documents and Settings/Administrator>sqlplus

SQL*Plus: Release 10.2.0.1.0 - Production on 星期日 2月 24 09:52:23 2008

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

请输入用户名:  sys as sysdba
输入口令:

连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

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

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
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> select sysdate from dual;

SYSDATE
--------------
24-2月 -08

SQL> alter session set nls_date_format='yyy-mm-dd';

会话已更改。

SQL> select sysdate from dual;

SYSDATE
---------
008-02-24

SQL> alter session set nls_date_format='yyyy-mm-dd';

会话已更改。

SQL> select sysdate from dual;

SYSDATE
----------
2008-02-24

SQL> set line 9000
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               ZHS16GBK
NLS_CALENDAR                   GREGORIAN
NLS_DATE_FORMAT                DD-MON-RR
NLS_DATE_LANGUAGE              AMERICAN
NLS_SORT                       BINARY
NLS_TIME_FORMAT                HH.MI.SSXFF AM

PARAMETER                      VALUE
------------------------------ -------------------------------------------------
-------------------------------
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行。

SQL> SELECT NLS_CHARSET_NAME(TO_NUMBER('0354','XXXX')) FROM DUAL;

NLS_CHARSET_NAME(TO_NUMBER('0354','XXXX'
----------------------------------------
ZHS16GBK

SQL>

原创粉丝点击