oracle檢視字符集後修改oracle服務端和客戶端字符集的步驟
1.oracle server端字符集查詢
程式碼如下:
select userenv ('language') from dual;
或:
col PARAMETER format a20;
col VALUE format a30;
SQL> select * from nls_database_parameters ;
PARAMETER VALUE
-------------------- ------------------------------
NLS_RDBMS_VERSION 12.1.0.2.0
NLS_NCHAR_CONV_EXCP FALSE
NLS_LENGTH_SEMANTICS BYTE
NLS_COMP BINARY
NLS_DUAL_CURRENCY $
NLS_TIMESTAMP_TZ_FOR DD-MON-RR HH.MI.SSXFF AM TZR
MAT
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_FORMAT HH.MI.SSXFF AM
PARAMETER VALUE
-------------------- ------------------------------
NLS_SORT BINARY
NLS_DATE_LANGUAGE AMERICAN
NLS_DATE_FORMAT DD-MON-RR
NLS_CALENDAR GREGORIAN
NLS_NUMERIC_CHARACTE .,
RS
NLS_NCHAR_CHARACTERS AL16UTF16
ET
NLS_CHARACTERSET AL32UTF8
PARAMETER VALUE
-------------------- ------------------------------
NLS_ISO_CURRENCY AMERICA
NLS_CURRENCY $
NLS_TERRITORY AMERICA
NLS_LANGUAGE AMERICAN
20 rows selected.
server字符集修改:
將資料庫啟動到RESTRICTED模式下做字符集更改:
程式碼如下:
SQL>conn /as sysdba
SQL>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;
ALTER DATABASE CHARACTER SET ZHS16GBK ERROR at line 1:
ORA-12712: new character set must be a superset of old character set
提示我們的字符集:新字符集必須為舊字符集的超集,這時我們可以跳過超集的檢查做更改:
程式碼如下:
SQL>ALTER DATABASE character set INTERNAL_USE ZHS16GBK;
SQL>select * from v$nls_parameters;
重啟檢查是否更改完成:
程式碼如下:
SQL>shutdown immediate;
SQL>startup
SQL>select * from v$nls_parameters;
我們看到這個過程和之前ALTER DATABASE CHARACTER SET操作的內部過程是完全相同的,也就是說INTERNAL_USE提供的幫助就是使Oracle資料庫繞過了子集與超集的校驗
這一方法在某些方面是有用處的,比如測試;應用於產品環境時大家應該小心,可能會有一些意外的問題。
2.oracle client端字符集修改
程式碼如下:
$echo $NLS_LANG
client字符集修改:
在 /home/oracle與 /root使用者目錄下的.bash_profile中新增或修改 export NLS_LANG="AMERICAN_AMERICA.UTF8" 語句
關閉當前ssh視窗。
注意:NLS_LANG變數一定要配置正確否則會引起sqlplus失效。
3.修改資料庫字符集為UTF-8
1.以DBA登入
2.執行轉換語句:
程式碼如下:
SHUTDOWN IMMEDIATE;
STARTUP MOUNT EXCLUSIVE;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
ALTER DATABASE NATIONAL CHARACTER SET UTF8;
SHUTDOWN IMMEDIATE;
STARTUP;
注意:如果沒有大物件,在使用過程中進行語言轉換沒有什麼影響!
可能會出現ORA-12717:CANNOT ALTER DATABASE NATIONAL CHARACTER SET WHEN NCLOBDATAEXISTS, 解決這個問題的方法
利用INTERNAL_USE 關鍵字修改區域設定
程式碼如下:
ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8;