當您使用DTS傳輸Oracle的資料,或者將資料轉儲到Oracle資料庫時,需要瞭解DTS支援的能力、功能限制和接入DTS的準備工作,以便您平穩地完成資料同步或遷移。
資料庫限制
自建Oracle為源
限制項 | 說明 |
支援的版本 | 支援10g、11g、12c、18c、19c版本。 |
支援的架構 |
|
支援的資料 |
|
網路頻寬 | 須大於等於100 Mb/s。 |
業務要求 |
|
接入方式 |
|
其他限制 |
|
Amazon RDS Oracle為源
限制項 | 說明 |
支援的版本 | 支援10g、11g、12c、18c、19c版本。 |
支援的架構 |
|
支援的資料 |
|
網路頻寬 | 須大於等於100 Mb/s。 |
業務要求 |
|
接入方式 |
|
其他限制 |
|
Oracle為目標
限制項 | 說明 |
支援的版本 | 支援10g、11g、12c、18c、19c版本。 |
支援的架構 |
|
網路頻寬 | 須大於等於100 Mb/s。 |
接入方式 |
|
其他限制 |
|
資料庫配置
Oracle為源的全量任務:無需在源庫執行特殊配置。
Oracle為源的增量任務:由於需要擷取增量變更,需在Oracle資料庫中完成如下配置以抓取和解析源庫日誌。
Oracle為目標的全量或增量任務:無需在目標庫執行特殊配置。
自建Oracle為源
開啟日誌歸檔模式
檢查源庫是否已經開啟歸檔模式。
archive log list;
說明若Database log mode為Archive Mode則表示已開啟歸檔模式,請執行開啟補充日誌。
歸檔日誌保留時間必須大於等於3天。
重啟資料庫。
重要為避免影響您的業務使用,請在業務低峰期操作。
shutdown immediate; startup mount;
開啟日誌歸檔模式。
alter database archivelog; alter database open;
檢查日誌歸檔配置是否生效。
archive log list;
開啟補充日誌
目前DTS支援開啟庫層級補充日誌和僅開啟表層級補充日誌兩種模式,您可以根據業務需求,選擇開啟庫層級補充日誌或者表層級補充日誌。
開啟庫層級補充日誌:DTS任務運行更為穩定。
開啟表層級補充日誌:遷移粒度為庫時,不支援遷移使用DDL新增的、且未開啟補充日誌的表,更節約源Oracle資料庫的磁碟空間。
開啟庫層級補充日誌
檢查庫層級補充日誌是否開啟。
SELECT supplemental_log_data_min, supplemental_log_data_pk,supplemental_log_data_ui FROM v$database;
如下所示為已開啟庫層級補充日誌,無需向下執行。
SUPPLEME SUP SUP -------- --- --- IMPLICIT YES YES
開啟庫層級最小補充日誌。
alter database add supplemental log data;
開啟庫級主鍵、唯一鍵補充日誌。
alter database add supplemental log data (primary key,unique index) columns;
檢查庫層級補充日誌是否開啟。
SELECT supplemental_log_data_min, supplemental_log_data_pk,supplemental_log_data_ui FROM v$database;
開啟表層級補充日誌
開啟最小補充日誌。
alter database add supplemental log data;
開啟表級補充日誌(兩者選其一)。
開啟表層級主鍵補充日誌
alter table <table_name> add supplemental log data (primary key) columns;
開啟表層級全欄位補充日誌
alter table <table_name> add supplemental log data (all) columns;
Amazon RDS Oracle為源
開啟日誌歸檔模式
執行如下命令,查看並設定歸檔日誌保留時間。
exec rdsadmin.rdsadmin_util.show_configuration;
exec rdsadmin.rdsadmin_util.set_configuration('archivelog retention hours', 72);
開啟補充日誌
目前DTS支援開啟庫層級補充日誌和僅開啟表層級補充日誌兩種模式,您可以根據業務需求,選擇開啟庫層級補充日誌或者表層級補充日誌。
開啟庫層級補充日誌:DTS任務運行更為穩定。
開啟表層級補充日誌:遷移粒度為庫時,不支援遷移使用DDL新增的、且未開啟補充日誌的表,更節約源Oracle資料庫的磁碟空間。
開啟庫層級補充日誌
檢查庫層級補充日誌是否開啟。
SELECT supplemental_log_data_min, supplemental_log_data_pk,supplemental_log_data_ui FROM v$database;
如下所示為已開啟庫層級補充日誌,無需向下執行。
SUPPLEME SUP SUP -------- --- --- IMPLICIT YES YES
開啟強制記錄模式。
exec rdsadmin.rdsadmin_util.force_logging(p_enable => true);
開啟庫級主鍵、唯一鍵補充日誌。
exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD', 'PRIMARY KEY'); exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD', 'UNIQUE');
開啟表層級補充日誌
開啟表層級全欄位補充日誌。
exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD', 'ALL');
開啟表層級主鍵補充日誌。
exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD', 'PRIMARY KEY');
Oracle為目標
無需特殊配置。
資料庫帳號準備
Oracle為源
使用DTS同步或遷移Oracle的資料時,需要建立用於採集資料的帳號並授權。採集資料的帳號要求的權限如下:
庫表結構和全量任務:需要授予DBA角色許可權或者精細化授權。
增量任務:需要精細授權。
重要源為非租戶式架構Oracle的增量任務,也可以授予資料擷取帳號DBA角色許可權。
授予DBA角色許可權
#建立資料庫帳號(以rdsdt_dtsacct為例)並進行授權
create user rdsdt_dtsacct identified by rdsdt_dtsacct;
grant create session to rdsdt_dtsacct;
grant connect to rdsdt_dtsacct;
grant dba to rdsdt_dtsacct;
#使用rdsdt_dtsacct帳號登入,檢查是否授權完成
select * from user_tab_privs;
select granted_role from user_role_privs;
庫表結構和全量任務精細授權
#建立資料庫帳號(以rdsdt_dtsacct為例)並進行授權
create user rdsdt_dtsacct identified by rdsdt_dtsacct;
grant create session to rdsdt_dtsacct;
grant connect to rdsdt_dtsacct;
grant select_catalog_role to rdsdt_dtsacct;
grant select any table to rdsdt_dtsacct;
#使用rdsdt_dtsacct帳號登入,檢查是否授權完成
select * from user_role_privs;
select * from user_sys_privs;
增量任務精細授權
Oracle 10g、11g版本
#建立資料庫帳號(以rdsdt_dtsacct為例)並進行授權
create user rdsdt_dtsacct identified by rdsdt_dtsacct;
grant create session to rdsdt_dtsacct;
grant connect to rdsdt_dtsacct;
grant select_catalog_role to rdsdt_dtsacct;
grant select any table to rdsdt_dtsacct;
grant select any transaction to rdsdt_dtsacct;
grant select on all_objects to rdsdt_dtsacct;
grant select on all_tab_cols to rdsdt_dtsacct;
grant select on dba_registry to rdsdt_dtsacct;
grant execute on sys.dbms_logmnr to rdsdt_dtsacct;
grant select on v_$log to rdsdt_dtsacct;
grant select on v_$logfile to rdsdt_dtsacct;
grant select on v_$standby_log to rdsdt_dtsacct;
-- Oracle以ADG備庫接入時,需要授予v_$standby_log許可權
grant select on v_$archived_log to rdsdt_dtsacct;
grant select on v_$parameter to rdsdt_dtsacct;
grant select on v_$database to rdsdt_dtsacct;
grant select on v_$active_instances to rdsdt_dtsacct;
grant select on v_$instance to rdsdt_dtsacct;
grant select on v_$logmnr_contents to rdsdt_dtsacct;
grant select on sys.USER$ to rdsdt_dtsacct;
grant select on sys.OBJ$ to rdsdt_dtsacct;
grant select on sys.COL$ to rdsdt_dtsacct;
grant select on sys.IND$ to rdsdt_dtsacct;
grant select on sys.ICOL$ to rdsdt_dtsacct;
grant select on sys.CDEF$ to rdsdt_dtsacct;
grant select on sys.CCOL$ to rdsdt_dtsacct;
grant select on sys.TABPART$ to rdsdt_dtsacct;
grant select on sys.TABSUBPART$ to rdsdt_dtsacct;
grant select on sys.TABCOMPART$ to rdsdt_dtsacct;
#使用rdsdt_dtsacct帳號登入,檢查是否授權完成
select * from user_role_privs;
select * from user_sys_privs;
select * from user_tab_privs;
Oracle 12c~19c(非租戶式)
#建立資料庫帳號(以rdsdt_dtsacct為例)並進行授權
create user rdsdt_dtsacct IDENTIFIED BY rdsdt_dtsacct;
grant create session to rdsdt_dtsacct;
grant connect to rdsdt_dtsacct;
grant select_catalog_role to rdsdt_dtsacct;
grant logmining to rdsdt_dtsacct;
grant execute_catalog_role to rdsdt_dtsacct;
grant select any table to rdsdt_dtsacct;
grant select any transaction to rdsdt_dtsacct;
grant select on all_objects to rdsdt_dtsacct;
grant select on all_tab_cols to rdsdt_dtsacct;
grant select on dba_registry to rdsdt_dtsacct;
grant execute on sys.dbms_logmnr to rdsdt_dtsacct;
grant select on v_$log to rdsdt_dtsacct;
grant select on v_$logfile to rdsdt_dtsacct;
grant select on v_$standby_log to rdsdt_dtsacct;
-- Oracle以ADG備庫接入時,需要授予v_$standby_log許可權
grant select on v_$archived_log to rdsdt_dtsacct;
grant select on v_$parameter to rdsdt_dtsacct;
grant select on v_$database to rdsdt_dtsacct;
grant select on v_$active_instances to rdsdt_dtsacct;
grant select on v_$instance to rdsdt_dtsacct;
grant select on v_$logmnr_contents to rdsdt_dtsacct;
grant select on sys.USER$ to rdsdt_dtsacct;
grant select on sys.OBJ$ to rdsdt_dtsacct;
grant select on sys.COL$ to rdsdt_dtsacct;
grant select on sys.IND$ to rdsdt_dtsacct;
grant select on sys.ICOL$ to rdsdt_dtsacct;
grant select on sys.CDEF$ to rdsdt_dtsacct;
grant select on sys.CCOL$ to rdsdt_dtsacct;
grant select on sys.TABPART$ to rdsdt_dtsacct;
grant select on sys.TABSUBPART$ to rdsdt_dtsacct;
grant select on sys.TABCOMPART$ to rdsdt_dtsacct;
#使用rdsdt_dtsacct帳號登入,檢查是否授權完成
select * from user_role_privs;
select * from user_sys_privs;
select * from user_tab_privs;
Oracle 12c~19c(租戶式)
PDB與CDB$ROOT中建立的帳號名稱(不包含全域帳號的開頭C##)需一致。
#切換至PDB,建立資料庫帳號(以rdsdt_dtsacct為例)並進行授權
alter session set container = ORCLPDB1;
create user rdsdt_dtsacct identified by rdsdt_dtsacct;
grant create session to rdsdt_dtsacct;
grant connect to rdsdt_dtsacct;
grant select_catalog_role to rdsdt_dtsacct;
grant logmining TO rdsdt_dtsacct;
grant execute_catalog_role to rdsdt_dtsacct;
grant select any table to rdsdt_dtsacct;
grant select any transaction to rdsdt_dtsacct;
grant select on all_objects to rdsdt_dtsacct;
grant select on all_tab_cols to rdsdt_dtsacct;
grant select on dba_registry to rdsdt_dtsacct;
grant execute on sys.dbms_logmnr to rdsdt_dtsacct;
grant select on v_$pdbs to rdsdt_dtsacct;
grant select on v_$log to rdsdt_dtsacct;
grant select on v_$logfile to rdsdt_dtsacct;
grant select on v_$standby_log to rdsdt_dtsacct;
-- Oracle以ADG備庫接入時,需要授予v_$standby_log許可權
grant select on v_$archived_log to rdsdt_dtsacct;
grant select on v_$parameter to rdsdt_dtsacct;
grant select on v_$database to rdsdt_dtsacct;
grant select on v_$active_instances to rdsdt_dtsacct;
grant select on v_$instance to rdsdt_dtsacct;
grant select on v_$logmnr_contents to rdsdt_dtsacct;
grant select on sys.USER$ to rdsdt_dtsacct;
grant select on sys.OBJ$ to rdsdt_dtsacct;
grant select on sys.COL$ to rdsdt_dtsacct;
grant select on sys.IND$ to rdsdt_dtsacct;
grant select on sys.ICOL$ to rdsdt_dtsacct;
grant select on sys.CDEF$ to rdsdt_dtsacct;
grant select on sys.CCOL$ to rdsdt_dtsacct;
grant select on sys.TABPART$ to rdsdt_dtsacct;
grant select on sys.TABSUBPART$ to rdsdt_dtsacct;
grant select on sys.TABCOMPART$ to rdsdt_dtsacct;
#切換至CDB$ROOT,進行帳號建立並授權
alter session set container = CDB$ROOT;
#建立資料庫帳號(以rdsdt_dtsacct為例)並進行授權(如使用此方式,則您需要修改Oracle資料庫的預設參數)
alter session set "_ORACLE_SCRIPT"=true;
create user rdsdt_dtsacct identified by rdsdt_dtsacct;
grant create session to rdsdt_dtsacct;
grant connect to rdsdt_dtsacct;
grant logmining to rdsdt_dtsacct;
grant execute_catalog_role to rdsdt_dtsacct;
grant select on v_$logmnr_contents to rdsdt_dtsacct;
grant execute on sys.dbms_logmnr to rdsdt_dtsacct;
#使用rdsdt_dtsacct帳號登入,檢查是否授權完成
select * from user_role_privs;
select * from user_sys_privs;
select * from user_tab_privs;
Amazon RDS Oracle(非租戶式)
建議使用Oracle SQL Developer進行授權操作。
#建立資料庫帳號(以RDSDT_DTSACCT為例)並進行授權
create user rdsdt_dtsacct identified by rdsdt_dtsacct;
grant create session to rdsdt_dtsacct;
grant connect to rdsdt_dtsacct;
grant logmining to rdsdt_dtsacct;
grant execute_catalog_role to rdsdt_dtsacct;
grant select any table to rdsdt_dtsacct;
grant select any transaction to rdsdt_dtsacct;
exec rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGMNR_LOGS','RDSDT_DTSACCT','SELECT');
exec rdsadmin.rdsadmin_util.grant_sys_object('ALL_OBJECTS','RDSDT_DTSACCT','SELECT');
exec rdsadmin.rdsadmin_util.grant_sys_object('ALL_TAB_COLS','RDSDT_DTSACCT','SELECT');
exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_REGISTRY','RDSDT_DTSACCT','SELECT');
exec rdsadmin.rdsadmin_util.grant_sys_object('V_$LOG','RDSDT_DTSACCT','SELECT');
exec rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGFILE','RDSDT_DTSACCT','SELECT');
exec rdsadmin.rdsadmin_util.grant_sys_object('V_$ARCHIVED_LOG','RDSDT_DTSACCT','SELECT');
exec rdsadmin.rdsadmin_util.grant_sys_object('V_$PARAMETER','RDSDT_DTSACCT','SELECT');
exec rdsadmin.rdsadmin_util.grant_sys_object('V_$DATABASE','RDSDT_DTSACCT','SELECT');
exec rdsadmin.rdsadmin_util.grant_sys_object('V_$ACTIVE_INSTANCES','RDSDT_DTSACCT','SELECT');
exec rdsadmin.rdsadmin_util.grant_sys_object('V_$INSTANCE','RDSDT_DTSACCT','SELECT');
exec rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGMNR_CONTENTS','RDSDT_DTSACCT','SELECT');
exec rdsadmin.rdsadmin_util.grant_sys_object('DBMS_LOGMNR','RDSDT_DTSACCT','EXECUTE');
exec rdsadmin.rdsadmin_util.grant_sys_object('USER$','RDSDT_DTSACCT','SELECT');
exec rdsadmin.rdsadmin_util.grant_sys_object('OBJ$','RDSDT_DTSACCT','SELECT');
exec rdsadmin.rdsadmin_util.grant_sys_object('COL$','RDSDT_DTSACCT','SELECT');
exec rdsadmin.rdsadmin_util.grant_sys_object('IND$', 'RDSDT_DTSACCT','SELECT');
exec rdsadmin.rdsadmin_util.grant_sys_object('ICOL$','RDSDT_DTSACCT','SELECT');
exec rdsadmin.rdsadmin_util.grant_sys_object('CDEF$','RDSDT_DTSACCT','SELECT');
exec rdsadmin.rdsadmin_util.grant_sys_object('CCOL$','RDSDT_DTSACCT','SELECT');
exec rdsadmin.rdsadmin_util.grant_sys_object('TABPART$','RDSDT_DTSACCT','SELECT');
exec rdsadmin.rdsadmin_util.grant_sys_object('TABSUBPART$','RDSDT_DTSACCT','SELECT');
exec rdsadmin.rdsadmin_util.grant_sys_object('TABCOMPART$','RDSDT_DTSACCT','SELECT');
#使用RDSDT_DTSACCT帳號登入,檢查是否授權完成
select * from user_role_privs;
select * from user_sys_privs;
select * from user_tab_privs;
Oracle為目標
使用DTS同步或遷移Oracle的資料時,需要建立用於複製資料的帳號並授權。複製資料的帳號要求的權限如下:
庫表結構任務:需要授予DBA角色許可權。
全量和增量任務:需要授予resource角色許可權。
授予DBA角色許可權
#建立資料庫帳號(以rdsdt_dtsacct為例)並進行授權
create user rdsdt_dtsacct identified by rdsdt_dtsacct;
grant create session to rdsdt_dtsacct;
grant connect to rdsdt_dtsacct;
grant dba to rdsdt_dtsacct;
#使用rdsdt_dtsacct帳號登入,檢查是否授權完成
select * from user_tab_privs;
select granted_role from user_role_privs;
授予resource角色許可權
#建立資料庫帳號(以rdsdt_dtsacct為例)並進行授權
create user rdsdt_dtsacct identified by rdsdt_dtsacct;
grant create session to rdsdt_dtsacct;
grant connect to rdsdt_dtsacct;
grant resource to rdsdt_dtsacct;
#使用rdsdt_dtsacct帳號登入,檢查是否授權完成
select * from user_tab_privs;
select granted_role from user_role_privs;
後續步驟
附錄
DTS任務對Oracle資料類型和字元集的支援如下所示。
資料類型
支援 | 不支援 |
|
|
字元集
支援 | 不支援 |
ASCII、ISO、UNICODE、US7ASCII、WE8HP、US8PC437、WE8EBCDIC285、WE8PC850、D7DEC、F7DEC、S7DEC、E7DEC、SF7ASCII、NDK7DEC、I7DEC、NL7DEC、CH7DEC、YUG7ASCII、SF7DEC、TR7DEC、IW7IS960、IN8ISCII、EE8ISO8859P2、SE8ISO8859P3、NEE8ISO8859P4、CL8ISO8859P5、AR8ISO8859P6、EL8ISO8859P7、IW8ISO8859P8、WE8ISO8859P9、NE8ISO8859P10、TH8TISASCII、BN8BSCII、VN8VN3、VN8MSWIN1258、WE8NEXTSTEP、AR8ASMO708PLUS、AR8EBCDICX、AR8XBASIC、EL8DEC、TR8DEC、WE8EBCDIC37、WE8EBCDIC37C、WE8EBCDIC500、WE8EBCDIC500C、WE8EBCDIC871、WE8EBCDIC284、EEC8EUROASCI、EEC8EUROPA3、LA8PASSPORT、BG8PC437S、EE8PC852、RU8PC866、RU8BESTA、IW8PC1507、RU8PC855、TR8PC857、CL8MACCYRILLIC、CL8MACCYRILLICS、WE8PC860、IS8PC861、EE8MSWIN1250、CL8MSWIN1251、ET8MSWIN923、BG8MSWIN、EL8MSWIN1253、IW8MSWIN1255、LT8MSWIN921、TR8MSWIN1254、WE8MSWIN1252、BLT8MSWIN1257、D8EBCDIC273、I8EBCDIC280、DK8EBCDIC277、S8EBCDIC278、F8EBCDIC297、IW8EBCDIC1086、N8PC865、BLT8CP921、LV8PC1117、LV8PC8LR、LV8RST104090、CL8KOI8R、BLT8PC775、F7SIEMENS9780X、E7SIEMENS9780X、S7SIEMENS9780X、DK7SIEMENS9780X、N7SIEMENS9780X、I7SIEMENS9780X、D7SIEMENS9780X、WE8GCOS7、EL8GCOS7、US8BS2000、D8BS2000、F8BS2000、E8BS2000、DK8BS2000、S8BS2000、WE8BS2000、WE8BS2000L5、CL8BS2000、WE8DG、WE8NCR4970、WE8ROMAN8、EE8MACCE、EE8MACCES、EE8MACCROATIAN、EE8MACCROATIANS、TR8MACTURKISH、TR8MACTURKISHS、IS8MACICELANDIC、IS8MACICELANDICS、EL8MACGREEK、EL8MACGREEKS、IW8MACHEBREW、IW8MACHEBREWS、US8ICL、WE8ICL、WE8ISOICLUK、WE8MACROMAN8、WE8MACROMAN8S、TH8MACTHAI、TH8MACTHAIS、HU8CWI2、EL8PC437S、EL8PC737、LT8PC772、LT8PC774、EL8PC869、EL8PC851、CDN8PC863、HU8ABMOD、AR8ASMO8X、AR8HPARABIC8T、AR8NAFITHA711、AR8NAFITHA711T、AR8SAKHR707、AR8SAKHR707T、AR8MUSSAD768、AR8MUSSAD768T、AR8ADOS710、AR8ADOS710T、AR8ADOS720、AR8ADOS720T、AR8APTEC715、AR8APTEC715T、AR8MSAWIN、AR8NAFITHA721、AR8NAFITHA721T、AR8SAKHR706、AR8ARABICMAC、AR8ARABICMACS、AR8ARABICMACT、LA8ISO6937、US8NOOP、WE8DEC、WE8DECTST、JA16VMS、JA16EUC、JA16EUCYEN、JA16EUCTILDE、JA16DBCS、JA16SJIS、JA16SJISTILDE、JA16SJISYEN、JA16EBCDIC930、JA16MACSJIS、KO16KSC5601、KO16DBCS、KO16KSCCS、KO16MSWIN949、ZHS16CGB231280、ZHS16MACCGB231280、ZHS16GBK、ZHS16DBCS、ZHS32GB18030、ZHT32EUC、ZHT32SOPS、ZHT16DBT、ZHT32TRIS、ZHT16DBCS、ZHT16BIG5、ZHT16CCDC、ZHT16MSWIN950、AL24UTFFSS、UTF8、UTFE、KO16TSTSET、JA16TSTSET2、JA16TSTSET、US16TSTFIXED、AL16UTF16LE、TH8TISEBCDIC、TH8TISEBCDICS、BLT8EBCDIC1112、BLT8EBCDIC1112S、CE8BS2000、CL8EBCDIC1025、CL8EBCDIC1025C、CL8EBCDIC1025R、CL8EBCDIC1025S、CL8EBCDIC1025X、CL8EBCDIC1158、CL8EBCDIC1158R、D8EBCDIC1141、DK8EBCDIC1142、EE8BS2000、EE8EBCDIC870、EE8EBCDIC870C、EE8EBCDIC870S、EL8EBCDIC423R、EL8EBCDIC875、EL8EBCDIC875S、EL8EBCDIC875R、F8EBCDIC1147、I8EBCDIC1144、WE8BS2000E、WE8EBCDIC1047、WE8EBCDIC1047E、WE8EBCDIC1140、WE8EBCDIC1140C、WE8EBCDIC1145、WE8EBCDIC1146、WE8EBCDIC1148、WE8EBCDIC1148C、AR8EBCDIC420S、IW8EBCDIC424、IW8EBCDIC424S、TR8EBCDIC1026、TR8EBCDIC1026S、ZHT16HKSCS、ZHT16HKSCS31、BLT8ISO8859P13、WE8ISO8859P1、WE8ISO8859P15、AR8MSWIN1256、S8EBCDIC1143、AZ8ISO8859P9E、CEL8ISO8859P14、CL8ISOIR111、CL8KOI8U、WE8PC858、WE8EBCDIC924、AL32UTF8、AL16UTF16 | 其餘類型的字元集 |