大家好,欢迎来到IT知识分享网。
http://www.linuxidc.com/Linux/2011-11/47383p2.htm
什么是Oracle字符集
Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。
它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。
解决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一定要设置成与操作系统字符集一致才不会出现中文乱码或者显示?的问题。
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。
=================================
查询字符集
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)
——————————————————————————————-
CLI客户端
最精简的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问题
1、在64系统里执行32位程序如果出现/lib/ld-linux.so.2:
bad ELF interpreter: No such file or directory,安装下glic即可
sudo yum install glibc.i686
2、error while loading shared libraries: libz.so.1:
cannot open shared object file: No such file or directory
sudo yum install zlib.i686
GUI客户端
toad for oracle 12.6.0.53 freeware edition
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、DB2、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
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/34618.html