oracle字符集与客户端

http://www.linuxidc.com/Linux/2011-11/47383p2.htm

什么是Oracle字符集
Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构容许你使用本地化语言来存储,处理,检索数据。
它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。mysql

解决Oracle的客户端乱码问题的关键关键是要把服务器端使用的字符集跟客户端使用的字符集统一块儿来。而Oracle客户端(Sqlplus)就是经过NLS_LANG环境变量来肯定客户端使用的字符集。
==============================
字符集一共有三种:
a.操做系统字符集
b.Oracle数据库字符集
c.软件(各类客户端软件)字符集

若是软件有字符集,就不会使用操做系统的字符集;若是没有字符集(好比SQL/PLUS就没有字符集),那么在输入和显示中文时就调用操做系统的字符集来进行编码。SQL/PLUS在输入中文之后,会调用操做系统的字符集将中文转化成编码,而后传递给Oracle数据库,Oracle数据库经过查看nls_language来获取操做系统使用的字符集,若是俩字符集是一致的,那么就会直接将编码存入Oracle数据库;若是不一致,Oracle数据库首先会用nls_lang所代表的字符集将编码转化成字符,而后用Oracle数据库本身的字符集将字符转化成编码存入数据库。总之,全部字符集的转化都是在Oracle端进行的,Oracle数据库在存储数据的时候必定是按照本身的字符集来存储的。
最重要的就是这个环境变量
NLS_LANG = language_territory.charset
NLS_LANG各部分含义以下:
LANGUAGE指定:
-Oracle消息使用的语言
-日期中月份和日显示
TERRITORY指定
-货币和数字格式
-地区和计算星期及日期的习惯
CHARACTERSET:
-控制客户端应用程序使用的字符集
一般设置或者等于客户端(如Windows)代码页
或者对于unicode应用设置为UTF8

从NLS_LANG的组成咱们能够看出,真正影响数据库字符集的实际上是第三部分。
因此两个数据库之间的字符集只要第三部分同样就能够相互导入导出数据,前面影响的只是提示信息是中文仍是英文。

操做系统经常使用的字符集一共两种,一种是UTF8,还有一种就是中文。windows经过chcp命令来查询操做系统所使用的字符集,若是现实"活动代码页:936",就表示操做系统使用的字符集是中文,这时只要将nls_lang经过Set nls_lang=american_america.zhs16gbk命令设置成GBK便可,总之,NLS_LANG必定要设置成与操做系统字符集一致才不会出现中文乱码或者显示?的问题。linux

 

where language specifies the conventions to use for Oracle Database messages, sorting order, day and month names.
If language is not set, it defaults to AMERICAN.

where territory specifies the convention for default dates, and for monetary, and numeric formats.
If territory is not set, the default value is derived from the language value, and so is set to AMERICA.

where, in SQL*Plus command-line, charset specifies the character set encoding used by SQL*Plus for data processing, and is generally suited to that of the users terminal.

===================================
服务器字符集select * from nls_database_parameters,其来源于props$,是表示数据库的字符集。
客户端字符集select * from nls_instance_parameters,其来源于v$parameter,表示客户端的字符集的设置,多是参数文件,环境变量或者是注册表
会话字符集     select * from nls_session_parameters,其来源于v$nls_parameters,表示会话本身的设置,多是会话的环境变量或者是alter session完成,若是会话没有特殊的设置,将与nls_instance_parameters一致。

客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。
若是多个设置存在的时候,NLS做用优先级别:Sql function > alter session > 环境变量或注册表 > 参数文件 > 数据库默认参数
字符集要求一致,可是语言设置却能够不一样,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang能够是American_America.zhs16gbk。sql

=================================
查询字符集
select userenv('language') from dual;
set nls_lang=SIMPLIFIED CHINESE_CHINA.ZHS16GBK

select * from nls_database_parameters;
SELECT * FROM v$nls_parameters;

--NLS_LANGUAGE
--NLS_TERRITORY
--NLS_CHARACTERSET

SELECT * FROM v$nls_valid_values;

select * from v$nls_valid_values
where parameter='LANGUAGE'
order by value;
--SIMPLIFIED CHINESE

select * from v$nls_valid_values
where parameter='TERRITORY'
order by value;
--CHINA

select * from v$nls_valid_values
where parameter='CHARACTERSET'
order by value;
--ZHS16GBK

下面这个设置的值就是上面查询到的有的
set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
AMERICAN_AMERICA. ZHS16GBK

==================================
正确导入与导出

1. oracel server端的字符集;
2. oracle client端的字符集;
3. dmp文件的字符集。
在作数据导入的时候,须要这三个字符集都一致才能正确导入。

2.1 查询oracle server端的字符集
有不少种方法能够查出oracle server端的字符集,比较直观的查询方法是如下这种:
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.ZHS16GBK

2.2 如何查询dmp文件的字符集
用oracle的exp工具导出的dmp文件也包含了字符集信息,dmp文件的第2和第3个字节记录了dmp文件的字符集。
若是dmp文件不大,好比只有几M或几十M,能够用UltraEdit打开(16进制方式),看第2第3个字节的内容,如0354,而后用如下SQL查出它对应的字符集:
SQL> select nls_charset_name(to_number('0354','xxxx')) from dual;
ZHS16GBK
若是dmp文件很大,好比有2G以上(这也是最多见的状况),用文本编辑器打开很慢或者彻底打不开,能够用如下命令(在unix主机上):
cat exp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6
而后用上述SQL也能够获得它对应的字符集。

2.3 查询oracle client端的字符集
在windows平台下,就是注册表里面相应OracleHome的NLS_LANG。还能够在dos窗口里面本身设置,
好比: set nls_lang=AMERICAN_AMERICA.ZHS16GBK
这样就只影响这个窗口里面的环境变量。
在unix平台下,就是环境变量NLS_LANG。
$echo $NLS_LANG
AMERICAN_AMERICA.ZHS16GBK

若是检查的结果发现server端与client端字符集不一致,请统一修改成同server端相同的字符集。
=====================================
更改oracle服务器字符集

>shutdown immediate;
>startup mount;
>alter system enable restricted session;
>alter system set job_queue_processes=0;
>alter system set aq_tm_processes=0;
>alter database open;
>alter database character set utf8;
OR
>alter database character set internal_use utf8;
>shutdown immediate;
>startup; (重开正常oracle)数据库

 

-------------------------------------------------------------------------------------------windows

 

CLI客户端 bash

最精简的sqlplus客户端安装

在安装数据库的机器上复制出6个文件(一个执行文件,5个库文件)到想要充当客户端的机器中的一个目录中,
先在源查出相关文件所在的位置,再进行复制与打包,并传送到目的地,在目的地解压,并进行相关配置
locate libsqlplusic.so
cd /usr/lib/oracle/10.2.0.3/client/lib
cp libclntsh.so.10.1 libnnz10.so libociei.so libsqlplus.so libsqlplusic.so ../bin/sqlplus ~/sq
tar cf sq.tar sq
scp sq.tar root@172.16.1.44:/root/

在目的地解压,并进行相关配置
tar xf sq.tar
11:59:38 22 ~/sq:#ll
total 96980
-rw-r--r--. 1 500 500 18825267 Jun 19 10:48 libclntsh.so.10.1
-rw-r--r--. 1 500 500  5486009 Jun 19 10:48 libnnz10.so
-rw-r--r--. 1 500 500 72480394 Jun 19 10:48 libociei.so
-rw-r--r--. 1 500 500  1434235 Jun 19 10:49 libsqlplusic.so
-rw-r--r--. 1 500 500  1057777 Jun 19 10:46 libsqlplus.so
-rwxr-xr-x. 1 500 500     4284 Jun 19 10:47 sqlplus

linux动态库加载路径修改
1.在 /etc/ld.so.conf 文件中添加搜索路径,重启或者 ldconfig 生效;
2.在 /etc/ld.so.conf.d 目录下添加 *.conf 文件,其中能够添加搜索路径,重启获取运行 ldconfig 生效;
3.export LD_LIBRARY_PATH=newpath:LD_LIBRARY_PATH ,这种方式能够临时生效;

LD_LIBRARY_PATH=/root/sq:${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH

PATH=/root/sq:${PATH}
export PATH

NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export NLS_LANG

11:52:42 17 /etc/ld.so.conf.d:#/root/sq/sqlplus flt/flt123@\"//172.16.1.11:1521/flt\"

SQL*Plus: Release 10.2.0.3.0 - Production on Fri Jun 19 11:53:08 2015

Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.


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

SQL>

到此链接成功

下面是遇到的问题,由于在64系统里执行32位程序,须要安装一下glibc.i686便可
11:41:30 28 ~/sq:#./sqlplus flt/flt123@\"//172.16.1.11/flt\"
-bash: ./sqlplus: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory

修复/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory问题

一、在64系统里执行32位程序若是出现/lib/ld-linux.so.2:
bad ELF interpreter: No such file or directory,安装下glic便可
sudo yum install glibc.i686

二、error while loading shared libraries: libz.so.1:
cannot open shared object file: No such file or directory
sudo yum install zlib.i686 服务器

 

GUI客户端session

toad for oracle 12.6.0.53 freeware editionoracle

 

Query Builder window编辑器

reverse engineering of queries  逆向工程的查询

两种访问方式:

快捷图标访问  query builder

菜单栏访问  database>report>query builder

 

query viewer

dockable panel  可停靠的

To access the Query Viewer

Do one of the following:
        From the View menu, select Query Viewer.
        From the Editor, right click, select Desktop and select Query Viewer.

Oracle Application Express (Oracle APEX),

 

SQuirreL SQL Client Version 3.7

若是您的工做要求您在一天之中链接许多不一样的数据库 (oracle、DB二、mysql、postgresql、Sql Server等等),或者你常常须要在多个不一样种类的数据库之间进行数导入导出。那么SQuirreL SQL Client 将会是比较理想的数据库客户端连接工具。
简单介绍:  
SQuirrel SQL Client是一个用Java写的数据库客户端,用JDBC统一数据库访问接口之后,能够经过一个统一的用户界面来操做MySQL PostgreSQL MSSQL Oracle等等任何支持JDBC访问的数据库。使用起来很是方便。并且,SQuirrel SQL Client仍是一个典型的Swing程序,也算是Swing的一个比较成功的应用了。

数据库启动之后,查询

jdbc:oracle:thin:@192.168.1.70:1521:orcl

 

相关文章
相关标签/搜索