今天看书上说乱码的产生主要是由于三个字符集的设置问题,分别为1
客户端应用字符集(Client Application Character Set)
2
客户端NLS_LANG参数设置
3
服务器端,数据库字符集(Character Set)设置我对前两个字符集设置不太理解,分别代表什么呢?如何查询以及修改
1代表我操作系统的?2代表SQL*PLUS的?SQL> select name,value$ from props$ where name like '%NLS%';NAME                           VALUE$
------------------------------ ------------------------------
NLS_LANGUAGE                   AMERICAN
NLS_TERRITORY                  AMERICA
NLS_CURRENCY                   $
NLS_ISO_CURRENCY               AMERICA
NLS_NUMERIC_CHARACTERS         .,
NLS_CHARACTERSET               UTF8
NLS_CALENDAR                   GREGORIAN
NLS_DATE_FORMAT                DD-MON-RR
NLS_DATE_LANGUAGE              AMERICAN
NLS_SORT                       BINARY
NLS_TIME_FORMAT                HH.MI.SSXFF AM
这个查询出来的应该是数据库的吧?

解决方案 »

  1.   


    客户端应用字符集(Client Application Character Set) 
    这个很少听说,我猜应该是安装软件本身的字符版本,比如中文版,英文版2 
    客户端NLS_LANG参数设置 
    这个是客户端的一个参数变量,window里可以在注册表里找到,也可以通过设置环境变量NLS_LANG(window和linux都通用),对客户端的字符进行转码。
      

  2.   

    今天在看《循序渐进ORACLE》里面第三章看到这三个字符集设置的,不太理解前两个字符集的含义就来问问。那乱码的产生会不会和我自己操作系统的字符集设置有关系
      

  3.   

    SQL> select name,value$ from props$ where name like '%NLS%';NAME                           VALUE$
    ------------------------------ ------------------------------
    NLS_LANGUAGE                   AMERICAN
    NLS_TERRITORY                  AMERICA
    NLS_CURRENCY                   $
    NLS_ISO_CURRENCY               AMERICA
    NLS_NUMERIC_CHARACTERS         .,
    NLS_CHARACTERSET               UTF8
    NLS_CALENDAR                   GREGORIAN
    NLS_DATE_FORMAT                DD-MON-RR
    NLS_DATE_LANGUAGE              AMERICAN
    NLS_SORT                       BINARY
    NLS_TIME_FORMAT                HH.MI.SSXFF AMNAME                           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         UTF8
    NLS_RDBMS_VERSION              10.2.0.1.020 rows selected.
    SQL> col parameter format a30
    SQL> col value format a30
    SQL> select * from v$nls_parameters;PARAMETER                      VALUE
    ------------------------------ ------------------------------
    NLS_LANGUAGE                   AMERICAN
    NLS_TERRITORY                  AMERICA
    NLS_CURRENCY                   $
    NLS_ISO_CURRENCY               AMERICA
    NLS_NUMERIC_CHARACTERS         .,
    NLS_CALENDAR                   GREGORIAN
    NLS_DATE_FORMAT                DD-MON-RR
    NLS_DATE_LANGUAGE              AMERICAN
    NLS_CHARACTERSET               UTF8
    NLS_SORT                       BINARY
    NLS_TIME_FORMAT                HH.MI.SSXFF AMPARAMETER                      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_NCHAR_CHARACTERSET         UTF8
    NLS_COMP                       BINARY
    NLS_LENGTH_SEMANTICS           BYTE
    NLS_NCHAR_CONV_EXCP            FALSE19 rows selected.SQL> select * from nls_database_parameters
      2  ;PARAMETER                      VALUE
    ------------------------------ ------------------------------
    NLS_LANGUAGE                   AMERICAN
    NLS_TERRITORY                  AMERICA
    NLS_CURRENCY                   $
    NLS_ISO_CURRENCY               AMERICA
    NLS_NUMERIC_CHARACTERS         .,
    NLS_CHARACTERSET               UTF8
    NLS_CALENDAR                   GREGORIAN
    NLS_DATE_FORMAT                DD-MON-RR
    NLS_DATE_LANGUAGE              AMERICAN
    NLS_SORT                       BINARY
    NLS_TIME_FORMAT                HH.MI.SSXFF AMPARAMETER                      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         UTF8
    NLS_RDBMS_VERSION              10.2.0.1.020 rows selected.SQL>我这三个查询出来的东西好像都一样哦?
      

  4.   

    C:\Documents and Settings\Admin>chcp
    活动的代码页: 936C:\Documents and Settings\Admin>sqlplus scottSQL*Plus: Release 10.2.0.1.0 - Production on Wed Sep 23 22:45:49 2009Copyright (c) 1982, 2005, Oracle.  All rights reserved.Enter password:
    ERROR:
    ORA-01017: 鐢ㄦ埛鍚?鍙d护鏃犳晥; 鐧诲綍琚嫆缁
    Enter user-name: scott
    Enter password:Connected to:
    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
    With the Partitioning, OLAP and Data Mining optionsSQL>
    这个地方为什么会出现乱码呢
    我注册表里的NLS_LANG都设置的是UTF8呀
      

  5.   

    刚才搜了些资料,明白了一些。
    因为SQL*PLUS中和服务器都设置的是UTF8,所以在SQL*PLUS从数据库提取数据时并不会进行字符转换,可这个时候我操作系统仍然使用的是GBK,所以在SQL*PLUS中显示出来的就会是乱码。做个实验,把SQL*PLUS的NLS_LANG改为SIMPLIFIED CHINESE_CHINA.ZHS16GBK,则就不会显示乱码了。
    因为在SQL*PLUS从数据库提取数据时由于SQL*PLUS和服务器字符集设置不同,所以进行了字符转换。个人理解,请大家指正。
      

  6.   

    不对 好像不太对
    SQL> create table test_haha(id int,name varchar2(20));Table created.
    SQL> insert into test_haha values(1,'哈哈');1 row created.SQL> select * from test_haha;        ID NAME
    ---------- --------------------
             1 哈哈SQL> conn scott
    Enter password:
    ERROR:
    ORA-01017: 鐢ㄦ埛鍚?鍙d护鏃犳晥; 鐧诲綍琚嫆缁
    Warning: You are no longer connected to ORACLE.
    SQL>
    那个错误提示是乱码,可是我插入中文好像显示的是正常的。
    我得再想想是怎么回事
      

  7.   

    C:\Documents and Settings\Admin>set nls_lang=SIMPLIFIED CHINESE_CHINA.ZHS16GBKC:\Documents and Settings\Admin>sqlplus scottSQL*Plus: Release 10.2.0.1.0 - Production on 星期四 9月 24 00:27:51 2009Copyright (c) 1982, 2005, Oracle.  All rights reserved.输入口令:
    ERROR:
    ORA-01017: 用户名/口令无效; 登录被拒绝
    请输入用户名:  scott
    输入口令:连接到:
    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
    With the Partitioning, OLAP and Data Mining optionsSQL>
    这样就可以了