一.字符集的简单理解:
 
字符集: 字符与编码对应的表。 当软件有字符集,就是使用自己的字符集,如果软件没有字符集就使用OS字符集。 

 
二.字符集的使用场合:
 
1.oracle有两种字符集:数据库字符集和国家字符集 。当安装数据库时选择了这两种字符集。           
 
 
      数据库字符集 的使用场合:
 
 
(1)用来存储CHAR, VARCHAR2, CLOB, LONG等类型数据
 
 
(2)用来标示诸如表名、列名以及PL/SQL变量等
 
 
(3)用来存储SQL和PL/SQL程序单元等
 
 
      国家字符集的使用场合:
 
 
(1)用以存储NCHAR, NVARCHAR2, NCLOB等类型数据
 

 

 

 

 
2.查看数据库的字符集:
 

 
 
 

   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               WE8ISO8859P1     --数据库字符集
 
 

   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 rows selected. 
 
 
 
 
  
 
 
三.字符集的命名:
 
 
 
  
 
 

    Oracle的字符集命名遵循以下命名规则: 
  
 
  

    <Language><bit size><encoding> 
  
 
  

    即:  <语言><比特位数><编码> 
  
 
  

    比如: ZHS16GBK表示采用GBK编码格式、16位(两个字节)简体中文字符集 
  
 
  

    常见字符集: 
  
 
  

    US7ASCII          美国人常用的字符 
  
 
  

    zhs16cgb231280     较老的中文字符集, 只针对中国人使用。 
  
 
  
数据库字符集。 
  
 
  
国家字符集统一选 
   AF16UTF16
 
  
ZHS16GBK 
   是 
   zhs16cgb231280字符集的超集,但不是严格超集。
 
  

    utf8 
  
 
 
 
  
 
 

   2.查看oracle所有字符集 
 
 
 
 
   
 
  

    select * from V$NLS_VALID_VALUES; 
  
 
 
 
  
 
 

   3.查看OS的字符集: 
 
 
 

    linux: locale,locale -a 
 
 
 

    windows: chcp 
 
 
 
 
  
 
 
四.客户端OS字符集、NLS_LANG设置、服务器端OS字符集、Oracle数据库字符集:
 
 
 
  
 
 

   1.客户端软件sqlplus没有字符集, 使用的是操作系统的字符集。 
 
 
 

   2.如果软件有字符集,则操作系统字符集失效。所以oracle不会用操作系统的字符集。 
 
 
 

   3.所有的字符集转换都是在oracle端转换的。 
 
 
 

   4.主要流程: 
 
 
 

   使用sqlplus输入中文,使用操作系统字符集对中文进行编码。然后传到oracle。当oracle的字符集与客户端的字符集不一致时,oracle要将编码转成字符,然后使用数据库的字符集将字符重新编码再保存起来。 
 
 
 
5.oracle如何知道客户端的字符集:
 
 

   oracle通过NLS_LANG参数知道客户端的字符集。 
 
 
 

   在客户端设置NLS_LANG参数. 
 
 
 

   设置客户端的字符集:set NLS_LANG=american_america.zhs16gbk 
 
 
 
 
  
 
 

   6.如何设置字符集: 
 
 
 
 
  
 
 

   ①.客户端操作系统的字符集: 中文, UTF8. 
 
 
 

   ②.oracle字符集: 一般在创建数据库时指定。 
 
 
 
客户端NLS_LANG参数设置: 一定要与客户端操作系统的字符集一致。
 
  
 
 
  
 
 
五.NLS_LANG的设置:一定要与客户端操作系统的字符集一致
 
  
 

   1.设置格式: 
 
 
 

    NLS_LANG=<language>_<territory>.<client character set>  
  
 
  

        Language:显示oracle消息,校验,日期命名 
  
 
  

        Territory:指定默认日期、数字、货币等格式 
  
 
  

        Client character set:指定客户端将使用的字符集 
  
 
  

        例如:NLS_LANG=AMERICAN_AMERICA.US7ASCII   
  
 
  

        AMERICAN是语言,AMERICA是地区,US7ASCII是客户端字符集 
  
 
 
 
  
 
 
 
  
 
 
 
  
 
 
六.实例:查看数据的字符编码
 
 
CharacterSet 
  。
 
  
 

     select id, name , dump(name,1016) from t2; 
 
 
 

      
 
 
 

   #查看你好的字符编码 
 
 
 

   SQL> select dump('你好',1016) from dual; 
 
 
 
1016) 
 
 
 

   ----------------------------------------------- 
 
 
 
CharacterSet=ZHS16GBK: c4,e3,ba,c3 
 
 
 
 
  
 
 

    # 
  
 
  

    SQL> select dump('你好',16) from dual; 
  
 
  
 
   
 
  

    DUMP('你好',16) 
  
 
  

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

    Typ=96 Len=4: c4,e3,ba,c3