修改Oracle字符集為UTF-8解決中文亂碼問題
很多情況下,遇到數(shù)據(jù)庫查詢數(shù)據(jù)中文亂碼,一般都是字符集的問題,下面記錄一下oracle字符集的查看方法,并提供UTF-8字符集的修改方式。
1、查看數(shù)據(jù)庫字符集
以下操作均在sqlplus或客戶端中執(zhí)行
數(shù)據(jù)庫服務(wù)器字符集:
select * from nls_database_parameters;
其來源于props$,是表示數(shù)據(jù)庫的字符集。
客戶端字符集環(huán)境:
select * from nls_instance_parameters;
其來源于v$parameter,
表示客戶端的字符集的設(shè)置,可能是參數(shù)文件,環(huán)境變量或者是注冊表
會話字符集環(huán)境:
select * from nls_session_parameters;
其來源于v$nls_parameters,表示會話自己的設(shè)置,可能是會話的環(huán)境變量或者是alter session完成,如果會話沒有特殊的設(shè)置,將與nls_instance_parameters一致。
重要提示:
客戶端的字符集要求與服務(wù)器一致,才能正確顯示數(shù)據(jù)庫的非Ascii字符。
如果多個設(shè)置存在的時候:
alter session>環(huán)境變量>注冊表>參數(shù)文件
2、修改oracle的字符集為UTF-8
① 在SQL PLUS 中,以DBA登錄
conn sys/sys as sysdba;
② 執(zhí)行轉(zhuǎn)換語句:
SHUTDOWN IMMEDIATE; --先關(guān)掉數(shù)據(jù)庫 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 AL32UTF8; --此處修改字符集關(guān)鍵語句 SHUTDOWN immediate; --修改完畢后重啟數(shù)據(jù)庫 STARTUP;
注意:
如果沒有大對象,在使用過程中進行語言轉(zhuǎn)換沒有什么影響,(切記設(shè)定的字符集必須是ORACLE支持,不然不能start)
上述過程可能會出現(xiàn)提示:
ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET when NCLOB data exists
要解決這個問題有兩種方法:
(1) 利用INTERNAL_USE
關(guān)鍵字修改區(qū)域設(shè)置
SHUTDOWN IMMEDIATE; --同樣需要關(guān)閉數(shù)據(jù)庫 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 INTERNAL_USEAL32UTF8; --此處加上了INTENAL_USER SHUTDOWN immediate; startup;
(2) 利用re-create
,但是re-create有點復(fù)雜,我也不會(逃) ③ 如果上面的方法執(zhí)行有問題
可以在sqlplus中強制轉(zhuǎn)換執(zhí)行如下語句
update sys.props$ set value$= 'AL32UTF8' WHERE name = 'NLS_CHARACTERSET'; commit;
然后重新啟動oracle或者重新啟動Linux系統(tǒng)。
一定要再執(zhí)行如下代碼:
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; COL VALUE NEW_VALUE CHARSET SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET'; COL VALUE NEW_VALUE NCHARSET SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_NCHAR_CHARACTERSET'; --INTERNAL_USE是沒有寫在文檔中的參數(shù),用以強制完成字符集一致化 ALTER DATABASE CHARACTER SET INTERNAL_USE &CHARSET; ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE &NCHARSET; SHUTDOWN IMMEDIATE; STARTUP; -- 再次啟動數(shù)據(jù)庫一遍 SHUTDOWN IMMEDIATE; STARTUP;
至此,EXP問題得到了解決。
注意:修改字符集只是修改了數(shù)據(jù)字典,并沒有對數(shù)據(jù)進行字符集轉(zhuǎn)換!
④ 如果語言環(huán)境不一致,語言環(huán)境同時更新掉:
update sys.props$ set value$= 'SIMPLIFIED CHINESE' WHERE name = 'NLS_LANGUAGE'; update sys.props$ set value$= 'SIMPLIFIED CHINESE' WHERE name = 'NLS_DATE_LANGUAGE'; update sys.props$ set value$= 'CHINA' WHERE name = 'NLS_TERRITORY'; update sys.props$ set value$= 'CHINA' WHERE name = 'NLS_ISO_CURRENCY'; update sys.props$ set value$= '?' WHERE name = 'NLS_CURRENCY'; update sys.props$ set value$= '?' WHERE name = 'NLS_DUAL_CURRENCY'; commit;
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
inner join和left join之間的區(qū)別詳解
這篇文章主要給大家介紹了關(guān)于inner join和left join之間區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01CMD操作oracle數(shù)據(jù)導(dǎo)庫過程圖解
這篇文章主要介紹了CMD操作oracle數(shù)據(jù)導(dǎo)庫過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07oracle 11g的警告日志和監(jiān)聽日志的刪除方法
這篇文章主要介紹了oracle 11g的警告日志和監(jiān)聽日志的刪除方法,需要的朋友可以參考下2014-07-07Oracle數(shù)據(jù)IMP和EXP命令用法詳解
這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)IMP和EXP命令用法詳解的相關(guān)資料,我們可以使用Oracle自帶的exp、imp命令來進行數(shù)據(jù)庫備份,imp和exp稱之為導(dǎo)入導(dǎo)出,這種方式也能快速的導(dǎo)入導(dǎo)出table或數(shù)據(jù)庫,需要的朋友可以參考下2023-11-11Oracle數(shù)據(jù)庫找到 Top Hard Parsing SQL 語句
Oracle數(shù)據(jù)庫中的硬解析是指重新解析SQL語句并創(chuàng)建新的執(zhí)行計劃的過程,本文給大家介紹Oracle數(shù)據(jù)庫找到 Top Hard Parsing SQL 語句的方法,感興趣的朋友一起看看吧2025-01-01linux下oracle設(shè)置開機自啟動實現(xiàn)方法
你會發(fā)現(xiàn)Oracle沒有自行啟動,這是正常的,因為在Linux下安裝Oracle的確不會自行啟動,必須要自行設(shè)定相關(guān)參數(shù),首先先介紹一般而言如何啟動oracle2012-11-11