今天看书上说乱码的产生主要是由于三个字符集的设置问题,分别为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
这个查询出来的应该是数据库的吧?
客户端应用字符集(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
这个查询出来的应该是数据库的吧?
解决方案 »
- 请教:Oracle存储过程中需要写commit吗?
- long 型问题
- 关于oracle建库问题(包括表的建立,表的个数,之间联系等)
- SQL PLUS如何在网页里打开
- 【难?】标题太短,说不明白,进来看大屏幕吧。
- 我登陆 Oracle Management server 时 总是出错:管理员是:sysman,口令是:oemtemp,Oracle Management server
- oracle 数据库打开问题
- 如何用exp/imp将system的对象导入到其他用户中
- oracle 8.17里如何配置数据库连接字符串db_link?
- 机器名改变,智能代理不能起动,谁有高招?
- oracle 删除数据提交后能恢复吗?
- oracle数据导入
客户端应用字符集(Client Application Character Set)
这个很少听说,我猜应该是安装软件本身的字符版本,比如中文版,英文版2
客户端NLS_LANG参数设置
这个是客户端的一个参数变量,window里可以在注册表里找到,也可以通过设置环境变量NLS_LANG(window和linux都通用),对客户端的字符进行转码。
------------------------------ ------------------------------
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>我这三个查询出来的东西好像都一样哦?
活动的代码页: 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呀
因为SQL*PLUS中和服务器都设置的是UTF8,所以在SQL*PLUS从数据库提取数据时并不会进行字符转换,可这个时候我操作系统仍然使用的是GBK,所以在SQL*PLUS中显示出来的就会是乱码。做个实验,把SQL*PLUS的NLS_LANG改为SIMPLIFIED CHINESE_CHINA.ZHS16GBK,则就不会显示乱码了。
因为在SQL*PLUS从数据库提取数据时由于SQL*PLUS和服务器字符集设置不同,所以进行了字符转换。个人理解,请大家指正。
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>
那个错误提示是乱码,可是我插入中文好像显示的是正常的。
我得再想想是怎么回事
ERROR:
ORA-01017: 用户名/口令无效; 登录被拒绝
请输入用户名: scott
输入口令:连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining optionsSQL>
这样就可以了