字符集是按照一定的字符編碼方案,對一組特定的符號,分別賦予不同數值編碼的集合。
日常使用時,服務端與客戶端字符集需一致。
--服務端 select * from nls_database_parameters; --客戶端 SELECT USERENV('LANGUAGE') FROM DUAL;
數據庫字符集調整最常用的是ALTER命令和完全的導出和導入兩種。
第一種,ALTER DATABASE字符集語句是遷移字符集的最快方法,但只能在特殊情況下使用。ALTER DATABASE字符集語句不執行任何數據轉換,因此,當且僅當新字符集是當前字符集的嚴格超集時,才可以使用它。
--ALTER DATABASE字符集語句的語法如下,db_name為可選項: ALTER DATABASE [db_name] CHARACTER SET new_character_set;
第二種,數據泵(EXPDP/IMPDP)方式代價較高,耗時且占用資源多,並且需要在遷移時對數據進行掃描,確認在遷移時是否會發生數據截斷和字符集轉換錯誤。
數據庫字符集遷移有兩個階段:數據掃描和數據轉換。
在更改數據庫字符集之前,使用字符集掃描工具確定在更改數據庫字符集之前所需的工作量。
使用數據泵導入導出腳本示例,腳本需在數據庫服務器執行:
--查看管理員目錄 確認導出文件位置路徑 SELECT * FROM dba_directories; --expdp導出 帶有條件 expdp 用戶/密碼@服務名 directory=DATA_PUMP_DIR dumpfile=數據文件文件名.dmp logfile=日志文件文件名.log tables=導出表名 query='" where lsh in (select lsh from table_1 where code !='1' and flag='1')"' CONTENT選項可選導出結構或數據 導出格式默認為.dmp
--impdp導入 導入時重命名 存在表則增加數據 主鍵重復數據忽略 導入時也可以限定導入時所屬表空間 impdp 用戶/密碼@服務名 directory=DATA_PUMP_DIR dumpfile=數據文件文件名.dmp REMAP_TABLE =導出用戶名.導出表名:導入表名 TABLE_EXISTS_ACTION=append data_options=skip_constraint_errors
字符集掃描工具 Character Set Scanner
適用於 Oracle Database 10g 和 Oracle Database 11g 的字符集掃描程序作為數據庫軟件的一個組件提供。
Oracle Database 12c 不再支持或捆綁字符集掃描程序。
Database Migration Assistant for Unicode (DMU) 是替代字符集掃描程序的工具。
具體字符集掃描工具的介紹和使用請參考:https://docs.oracle.com/cd/B19306_01/server.102/b14225/ch12scanner.htm