Oracle字符集转换(四):4.配置测试环境
继续上一篇文章,我们来看看Oracle字符集转换测试环境的配置。可以检查Oracle服务器环境配置(三个实例、DB Link创建)、测试表创建、测试数据创建脚本。这个测试环境会在后面的字符集转换过程中用到。
这是上一篇文章的延续。
4.配置Oracle字符集转换测试环境
4.1。 Oracle 数据库服务器环境配置
假设在本地PC(Windows)上配置Oracle字符集转换的测试环境如下。
一台PC上安装了3个Oracle数据库实例,每个实例的配置如下。
| 环境 | 安全识别码 | 服务器字符集 | 甲骨文版本 | 测试用户(架构) |
| US7ASCII 当前数据库 | 奥劳斯7 | US7ASCII | 11.2.0.1.0 | 腿 |
| KO16MSWIN949 当前数据库 | 奥拉姆SWIN949 | KO16MSWIN949 | 11.2.0.1.0 | 腿 |
| AL32UTF8 目标数据库 | 奥拉夫 | AL32UTF8 | 11.2.0.1.0 | 腿 |
DB Link 的配置如下。
| 生成SID | 目标SID | 连接用户(架构) | 用法 |
| 奥拉姆SWIN949 | 奥劳斯7 | 腿 | KO16MSWIN949上的US7ASCII访问与转换测试 |
| 奥拉夫 | 奥劳斯7 | 腿 | AL32UTF8到US7ASCII的访问和转换测试 |
DB Link创建脚本如下。
CREATE DATABASE LINK DL_US7
CONNECT TO leg IDENTIFIED BY leg
USING '(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORAUS7)
)
)'
;
4.2.测试台配置
测试的数据模型如下。
(出于测试目的,省略了所有其他详细信息,例如规范化和标识符配置。US7ASCII 和 MSWIN949 应用相同的长度,AL32UTF8 增加长度。)
上述数据模型是在首尔市发布的数据集<首尔各地铁线路及车站上下客人数信息>中添加了两个测试用项目(参考描述、参考图像)的结构。
资源: https://data.seoul.go.kr/dataList/OA-12252/S/1/datasetView.do
创建上述测试数据模型架构的 DDL 如下。
-- 한글 2 byte 체계 스키마 생성(US7ASCII, MSWIN949)
CREATE TABLE SUB_MON_STAT
(
USE_MON VARCHAR2(8),
LINE_NUM VARCHAR2(14), -- AL32UTF8: 50
SUB_STA_ID VARCHAR2(4),
SUB_STA_NM VARCHAR2(20), -- AL32UTF8: 100
RIDE_PASGR_NUM NUMBER(10),
ALIGHT_PASGR_NUM NUMBER(10),
WORK_DT VARCHAR2(8),
COMMT VARCHAR2(4000),
REF_DES CLOB,
REF_IMG BLOB
);
-- 한글 3 byte 체계 스키마 생성(AL32UTF8)
CREATE TABLE SUB_MON_STAT
(
USE_MON VARCHAR2(8),
LINE_NUM VARCHAR2(50),
SUB_STA_ID VARCHAR2(4),
SUB_STA_NM VARCHAR2(100),
RIDE_PASGR_NUM NUMBER(10),
ALIGHT_PASGR_NUM NUMBER(10),
WORK_DT VARCHAR2(8),
COMMT VARCHAR2(4000),
REF_DES CLOB,
REF_IMG BLOB
);
在AL32UTF8中,一个韩文字符需要3个字节,因此两列的长度被充分增加。
Excel格式的数据文件可以从下面的github路径下载。
* Excel数据文件: https://github.com/DAToolset/Oracle-CharacterSet-Conversion/raw/main/地铁站乘客人数_首尔开放数据_2013.xlsx
用于将数据输入到表中的DML可以从下面的github路径下载。
*数据标记语言: https://github.com/DAToolset/Oracle-CharacterSet-Conversion/raw/main/地铁站乘客人数_首尔开放数据_2013.sql
上面的sql文件的一部分被摘录并粘贴在下面。
INSERT INTO SUB_MON_STAT(USE_MON, LINE_NUM, SUB_STA_ID, SUB_STA_NM, RIDE_PASGR_NUM, ALIGHT_PASGR_NUM, WORK_DT, COMMT, REF_DES, REF_IMG)
VALUES('201301', '1호선', '0150', '서울역', 2199181, 1855268, '20130723', RPAD('서울역', 3000, '서울역'), RPAD('서울역', 3000, '서울역'), UTL_RAW.CAST_TO_RAW('12345'));
INSERT INTO SUB_MON_STAT(USE_MON, LINE_NUM, SUB_STA_ID, SUB_STA_NM, RIDE_PASGR_NUM, ALIGHT_PASGR_NUM, WORK_DT)
VALUES('201301', '1호선', '0151', '시청', 737005, 726892, '20130723');
INSERT INTO SUB_MON_STAT(USE_MON, LINE_NUM, SUB_STA_ID, SUB_STA_NM, RIDE_PASGR_NUM, ALIGHT_PASGR_NUM, WORK_DT)
VALUES('201301', '1호선', '0152', '종각', 1542710, 1446464, '20130723');
INSERT INTO SUB_MON_STAT(USE_MON, LINE_NUM, SUB_STA_ID, SUB_STA_NM, RIDE_PASGR_NUM, ALIGHT_PASGR_NUM, WORK_DT)
VALUES('201301', '1호선', '0153', '종로3가', 1159253, 1126995, '20130723');
INSERT INTO SUB_MON_STAT(USE_MON, LINE_NUM, SUB_STA_ID, SUB_STA_NM, RIDE_PASGR_NUM, ALIGHT_PASGR_NUM, WORK_DT)
VALUES('201301', '1호선', '0154', '종로5가', 816307, 820769, '20130723');
INSERT INTO SUB_MON_STAT(USE_MON, LINE_NUM, SUB_STA_ID, SUB_STA_NM, RIDE_PASGR_NUM, ALIGHT_PASGR_NUM, WORK_DT)
VALUES('201301', '1호선', '0155', '동대문', 446527, 512163, '20130723');
INSERT INTO SUB_MON_STAT(USE_MON, LINE_NUM, SUB_STA_ID, SUB_STA_NM, RIDE_PASGR_NUM, ALIGHT_PASGR_NUM, WORK_DT)
VALUES('201301', '1호선', '0156', '신설동', 496150, 484583, '20130723');
INSERT INTO SUB_MON_STAT(USE_MON, LINE_NUM, SUB_STA_ID, SUB_STA_NM, RIDE_PASGR_NUM, ALIGHT_PASGR_NUM, WORK_DT)
VALUES('201301', '1호선', '0157', '제기동', 587740, 601913, '20130723');
INSERT INTO SUB_MON_STAT(USE_MON, LINE_NUM, SUB_STA_ID, SUB_STA_NM, RIDE_PASGR_NUM, ALIGHT_PASGR_NUM, WORK_DT)
VALUES('201301', '1호선', '0158', '청량리(지하)', 966341, 985741, '20130723');
INSERT INTO SUB_MON_STAT(USE_MON, LINE_NUM, SUB_STA_ID, SUB_STA_NM, RIDE_PASGR_NUM, ALIGHT_PASGR_NUM, WORK_DT)
VALUES('201301', '1호선', '0159', '동묘앞', 240864, 252523, '20130723');
INSERT INTO SUB_MON_STAT(USE_MON, LINE_NUM, SUB_STA_ID, SUB_STA_NM, RIDE_PASGR_NUM, ALIGHT_PASGR_NUM, WORK_DT)
VALUES('201301', '2호선', '0202', '을지로입구', 1610744, 1607133, '20130723');
INSERT INTO SUB_MON_STAT(USE_MON, LINE_NUM, SUB_STA_ID, SUB_STA_NM, RIDE_PASGR_NUM, ALIGHT_PASGR_NUM, WORK_DT)
VALUES('201301', '2호선', '0203', '을지로3가', 539622, 559866, '20130723');
INSERT INTO SUB_MON_STAT(USE_MON, LINE_NUM, SUB_STA_ID, SUB_STA_NM, RIDE_PASGR_NUM, ALIGHT_PASGR_NUM, WORK_DT)
VALUES('201301', '2호선', '0204', '을지로4가', 364217, 365994, '20130723');
INSERT INTO SUB_MON_STAT(USE_MON, LINE_NUM, SUB_STA_ID, SUB_STA_NM, RIDE_PASGR_NUM, ALIGHT_PASGR_NUM, WORK_DT)
VALUES('201301', '2호선', '0205', '동대문역사문화공원', 435358, 508405, '20130723');
INSERT INTO SUB_MON_STAT(USE_MON, LINE_NUM, SUB_STA_ID, SUB_STA_NM, RIDE_PASGR_NUM, ALIGHT_PASGR_NUM, WORK_DT)
VALUES('201301', '2호선', '0206', '신당', 407110, 438543, '20130723');
INSERT INTO SUB_MON_STAT(USE_MON, LINE_NUM, SUB_STA_ID, SUB_STA_NM, RIDE_PASGR_NUM, ALIGHT_PASGR_NUM, WORK_DT)
VALUES('201301', '2호선', '0207', '상왕십리', 288629, 274519, '20130723');
INSERT INTO SUB_MON_STAT(USE_MON, LINE_NUM, SUB_STA_ID, SUB_STA_NM, RIDE_PASGR_NUM, ALIGHT_PASGR_NUM, WORK_DT)
VALUES('201301', '2호선', '0208', '왕십리', 583444, 498091, '20130723');
INSERT INTO SUB_MON_STAT(USE_MON, LINE_NUM, SUB_STA_ID, SUB_STA_NM, RIDE_PASGR_NUM, ALIGHT_PASGR_NUM, WORK_DT)
VALUES('201301', '2호선', '0209', '한양대', 262492, 286399, '20130723');
INSERT INTO SUB_MON_STAT(USE_MON, LINE_NUM, SUB_STA_ID, SUB_STA_NM, RIDE_PASGR_NUM, ALIGHT_PASGR_NUM, WORK_DT)
VALUES('201301', '2호선', '0210', '뚝섬', 402631, 420166, '20130723');
...
到目前为止,我们已经了解了Oracle字符集转换的测试环境配置和配置脚本。接下来,我们将看看在这个测试环境中转换字符集的几种方法。我们将看看Oracle推荐的方法和需要单独实现的方法。







