oracle服務器和客戶端字符集的查看和修改

一、什么是oracle字符集?

Oracle字符集是一個字節數據的解釋的符號集合,有大小之分,有相互的包容關系。ORACLE 支持國家語言的體系結構允許你使用本地化語言來存儲,處理,檢索數據。它使數據庫工具,錯誤消息,排序次序,日期,時間,貨幣,數字,和日歷自動適應本地化語言和平臺。?

影響oracle數據庫字符集最重要的參數是NLS_LANG參數。?

它的格式如下:   NLS_LANG = language_territory.charset?

它有三個組成部分(語言、地域和字符集),每個成分控制了NLS子集的特性。?

其中:?

Language 指定服務器消息的語言,territory 指定服務器的日期和數字格式,charset 指定字符集。如:AMERICAN _ AMERICA. ZHS16GBK?

從NLS_LANG的組成我們可以看出,真正影響數據庫字符集的其實是第三部分。?

所以兩個數據庫之間的字符集只要第三部分一樣就可以相互導入導出數據,前面影響的只是提示信息是中文還是英文。?

二.查看數據庫字符集?

這涉及三方面的字符集,?

一是oracel server端的字符集;?

二是oracle client端的字符集;?

三是dmp文件的字符集。?

在做數據導入的時候,需要這三個字符集都一致才能正確導入。?

1、查詢oracle server端的字符集?

有很多種方法可以查出oracle server端的字符集,比較直觀的查詢方法是以下這種:?

SQL>select userenv(‘language’) from dual;?

結果類似如下:AMERICAN _ AMERICA. ZHS16GBK?

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也可以得到它對應的字符集。?

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端相同的字符集。?

補充:?

(1).數據庫服務器字符集?

select * from nls_database_parameters?

來源于props$,是表示數據庫的字符集。?

(2).客戶端字符集環境?

select * from nls_instance_parameters?

其來源于v$parameter,表示客戶端的字符集的設置,可能是參數文件,環境變量或者是注冊表?

(3).會話字符集環境?

select * from nls_session_parameters?

來源于v$nls_parameters,表示會話自己的設置,可能是會話的環境變量或者是alter session完成,如果會話沒有特殊的設置,將與nls_instance_parameters一致。?

(4).客戶端的字符集要求與服務器一致,才能正確顯示數據庫的非Ascii字符。如果多個設置存在的時候,alter session>環境變量>注冊表>參數文件?

字符集要求一致,但是語言設置卻可以不同,語言設置建議用英文。如字符集是zhs16gbk,則nls_lang可以是American_America.zhs16gbk。?

三、修改oracle的字符集?

上文說過,oracle的字符集有互相的包容關系。如us7ascii就是zhs16gbk的子集,從us7ascii到zhs16gbk不會有數據解釋上的問題,不會有數據丟失。在所有的字符集中utf8應該是最大,因為它基于unicode,雙字節保存字符(也因此在存儲空間上占用更多)。?

一旦數據庫創建后,數據庫的字符集理論上講是不能改變的。因此,在設計和安裝之初考慮使用哪一種字符集十分重要。根據Oracle的官方說明,字符集的轉換是從子集到超集受支持,反之不行。如果兩種字符集之間根本沒有子集和超集的關系,那么字符集的轉換是不受oracle支持的。對數據庫server而言,錯誤的修改字符集將會導致很多不可測的后果,可能會嚴重影響數據庫的正常運行,所以在修改之前一定要確認兩種字符集是否存在子集和超集的關系。一般來說,除非萬不得已,我們不建議修改oracle數據庫server端的字符集。特別說明,我們最常用的兩種字符集ZHS16GBK和ZHS16CGB231280之間不存在子集和超集關系,因此理論上講這兩種字符集之間的相互轉換不受支持。?

1、修改server端字符集(不建議使用)?

在oracle 8之前,可以用直接修改數據字典表props$來改變數據庫的字符集。但oracle8之后,至少有三張系統表記錄了數據庫字符集的信息,只改props$表并不完全,可能引起嚴重的后果。正確的修改方法如下:?

$sqlplus /nolog?

SQL>conn / as sysdba;   若此時數據庫服務器已啟動,則先執行SHUTDOWN IMMEDIATE命令關閉數據庫服務器,然后執行以下命令:?

SQL>STARTUP MOUNT;?

SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;?

SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;?

SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;?

SQL>ALTER DATABASE OPEN;?

SQL>ALTER DATABASE CHARACTER SET ZHS16GBK;?

SQL>ALTER DATABASE national CHARACTER SET ZHS16GBK;?

SQL>SHUTDOWN IMMEDIATE;?

SQL>STARTUP?

注意:如果沒有大對象,在使用過程中進行語言轉換沒有什么影響,(切記設定的字符集必須是ORACLE支持,不然不能start) 按上面的做法就可以,但是可能會出現‘ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET when NCLOB data exists’ 這樣的提示信息?

要解決這個問題有兩種方法?

一個是,利用INTERNAL_USE 關鍵字修改區域設置,?

還有一個是利用re-create,但是re-create有點復雜,所以請用internal_use,?

SQL>SHUTDOWN IMMEDIATE;?

SQL>STARTUP MOUNT EXCLUSIVE;?

SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;?

SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;?

SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;?

SQL>ALTER DATABASE OPEN;?

SQL>ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8;?

SQL>SHUTDOWN immediate;?

SQL>startup;?

如果按上面的做法做,National charset的區域設置就沒有問題?

2、修改dmp文件字符集?

上文說過,dmp文件的第2第3字節記錄了字符集信息,因此直接修改dmp文件的第2第3字節的內容就可以‘騙’過oracle的檢查。這樣做理論上也僅是從子集到超集可以修改,但很多情況下在沒有子集和超集關系的情況下也可以修改,我們常用的一些字符集,如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因為改的只是dmp文件,所以影響不大。?

具體的修改方法比較多,最簡單的就是直接用UltraEdit修改dmp文件的第2和第3個字節。?

比如想將dmp文件的字符集改為ZHS16GBK,可以用以下SQL查出該種字符集對應的16進制代碼:   SQL> select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual;?

0354?

然后將dmp文件的2、3字節修改為0354即可。?

如果dmp文件很大,用ue無法打開,就需要用程序的方法了

轉載于:https://www.cnblogs.com/chenjianhong/p/4144350.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273650.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273650.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273650.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java 按位運算符(,|,^,,)

&(按位與) 定義:針對二進制,只要有一個為0,就為0。2 & 5 02的二進制:00000000 00000000 00000000 000000105的二進制:00000000 00000000 00000000 00000101 |(按位或) 定義:針對二進制&#xff0c…

Oracle 多行合并一行 方法

假如有如下表,其中各個i值對應的行數是不定的 Sql代碼 SQL> select * from t; I A D ---------- ---------- ------------------- 1 b 2008-03-27 10:55:42 1 a 2008-03-27 10:55:46 1…

Docker 簡單入門(一)

Docker 簡介 Docker是一個開源的容器引擎,它有助于更快地交付應。Docker可將應用程序和基礎設施層隔離,并且能將基礎設施當作程序-樣進行管理。使用Docker,可更快地打包、測試以及部署應用程序,并可以縮短從編寫到部署運行代碼的周期。 Docke…

PDF解決方案(2)--文件轉PDF

相關專題鏈接: PDF解決方案(1)--文件上傳 PDF解決方案(2)--文件轉PDF PDF解決方案(3)--PDF轉SWF PDF解決方案(4)--在線瀏覽 前言:上一篇中講到的文件上傳&…

Docker 常用命令(二)

Docker 鏡像常用命令 搜索鏡像 可使用 docker search 命令搜索存放在 Docker Hub 中的鏡像。例如: docker search java 執行該命令后, Docker 就會在 Docker Hub 中搜索含有 java 這個關鍵詞的鏡像倉庫。執行該命令后,可看到類似于如下的表格…

Docker 使用Dockerfile構建Docker(三)

Dockerfile 簡單使用 先來編寫一個最簡單的 Dockerfile。 例如&#xff1a; FROM nginx RUN echo <h1>使用Dockerfile構建鏡像</h1> > /usr/share/nginx/html/index.html 該 Dockerfile 非常簡單&#xff0c;其中的 FORM 、 RUN 都是 Dockerfile 的指令。 FROM …

網絡流之最大流問題

Reference&#xff1a; http://blog.csdn.net/rrerre/article/details/6751520 http://blog.csdn.net/y990041769/article/details/21026445 http://www.nocow.cn/index.php/Translate:USACO/NetworkFlow 最大流Edmonds_Karp算法模板&#xff1a; EK算法即增廣路算法。 最大流最…

delphi讀取excel

簡單的例子 1 procedure TForm1.Button1Click(Sender: TObject);2 var3 ExcelApp,MyWorkBook: OLEVariant;4 begin5 opendialog1.Filter:Microsoft Excel Workbook (*.xls)|*.XLS|; 6 edit2.Text : sheet1;7 if opendialog1.Execute then8 begin9 edit1.Text:o…

Docker-compose 常用命令及網絡設置(五)

Docker Compose 常用命令 build 構建或重新構建服務。服務被構建后將會以 project_service的形式標記,例如:comoretest db。help 査看指定命令的幫助文檔,該命令非常實用。 docker-compose所有命令的幫助文檔都可通過該命令查看。 docker-compose he lp COMMAND 示例 docker-co…

淺談 trie樹 及其實現

定義&#xff1a;又稱字典樹&#xff0c;單詞查找樹或者前綴樹&#xff0c;是一種用于快速檢索的多叉樹結構&#xff0c; 如英文字母的字典樹是一個26叉樹&#xff0c;數字的字典樹是一個10叉樹。 核心思想&#xff1a;是空間換時間.利用字符串的公共前綴來降低查詢時間的開銷以…

Docker-compose 安裝與基本使用(四)

安裝 Docker-Compose Compose有多種安裝方式,例如通過 shell, pip以及將 Compose作為容器安裝等。本次安裝以Shell 為主。 通過以下命令自動下載并安裝適應系統版本的 Compose: curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(un…

如何開始DDD(完)

連續寫了兩篇文章&#xff0c;這一篇我想是序的完結篇了。結合用戶注冊的例子再將他簡單豐富一下。在這里只添加一個簡單需求&#xff0c;就是用戶注冊成功后給用戶發一封郵件。補充一下之前的代碼 public class DomainService {public void Register(User user){if (_userRepo…

git pull 報錯:Untracked Fles Preventing Merge

場景 使用 git pull 命令更新報錯解決 找到對應的文件刪除后重新打開項目。

關于string,我今天科普的

今天下午朋友討論組上討論一個關于string的問題&#xff0c;問題是這樣的&#xff0c;string a"aaa";string ba;a"bbb",為什么測試b的值不改變&#xff1f;之前我看過一個文章&#xff0c;知道肯定不相等&#xff0c;因為引用地址的一系列問題&#xff0c;…

git pull 報錯:The following untracked working tree files would be overwritten by merge

場景 使用 git pull 命令更新報錯 Updating d652d1c..fa05549 error: The following untracked working tree files would be overwritten by merge:.idea/encodings.xmlPlease move or remove them before you can merge. Aborting 解決 使用 git clean -d -fx 命令即可。

SpringBoot 配置多數據源

項目Git地址&#xff1a;SpringBoot 配置多數據源&#xff1a;Jacob-multi-data-source 準備工作 準備兩個數據庫(此模塊中兩個數據庫一個為本地 一個為遠程&#xff0c;本地為主&#xff0c;遠程為從)。然后建表。 #本地庫 CREATE TABLE username (id bigint(11) NOT NULL AUT…

HDU 2912

直線關于球的多次反射&#xff0c;求最后一次反射點 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath>using namespace std; const double inf1e10; const double eps1e-8; struct point {doub…

EMVTag系列3《持卡人基本信息數據》

9F61 持卡人證件號 L&#xff1a;2–26 R&#xff08;需求&#xff09;&#xff1a;數據應存在&#xff0c;在讀應用數據過程中&#xff0c;終端不檢查&#xff1b; (PBOC2.0第五部分中規定)芯片中持卡人姓名 5F20與持卡人姓名擴展9F0B只能使用一個&#xff0c;另一個必須不…

BindingException: Parameter 'XXX' not found. Available parameters are [collection, list]

應業務需求&#xff0c;需要使用到MQ進行數據上傳和下發。傳遞格式為JSON,服務那邊下發JSON數組&#xff0c;接收端將JSON數組轉換成List集合&#xff0c;調用Mybatis-plus批量添加saveBatch()。提示字段未找到... org.apache.ibatis.exceptions.PersistenceException: ### Er…

JDK 8 新特性 之 default關鍵字

前言 Jdk1.8之前的接口中只聲明方法&#xff0c;方法具體實現應在子類中進行。Jdk1.8打破了這樣的用法&#xff1a;接口中可以實現具體的方法體&#xff0c;只需要加上關鍵字static或者default修飾即可。 default關鍵字 public interface UserService {//自定義方法void getUse…