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