UTF8 切掉外部表中的字符
UTF8 cuts away characters in external tables
我在 18c 中使用带有 unicode 字符的外部 table 出现了一个奇怪的行为,这在 12.2
之前没有发生过
作为测试用例,我创建了一个带有 unicode 字符 + ABCD 的文件:
declare
v_file utl_file.file_type;
v_bas varchar2(20):='ABCD';
begin
v_file := utl_file.fopen('ORDER_ENTRY', 'datei.csv', 'W');
utl_file.put_line(v_file, '12;'||unistr('\C2B0')||v_bas);
utl_file.FFLUSH(v_file);
utl_file.fclose(v_file);
end;
/
为了读取数据,我创建了 3 个不同的外部 tables:
CREATE TABLE system.test_datei_csv_wep1
( rn number(10),
col1 VARCHAR2(10 CHAR)
)
ORGANIZATION EXTERNAL
( TYPE ORACLE_LOADER
DEFAULT DIRECTORY "ORDER_ENTRY"
ACCESS PARAMETERS
( RECORDS DELIMITED BY '\n'
STRING SIZES ARE IN CHARACTERS
CHARACTERSET 'WE8ISO8859P1'
TERRITORY 'GERMANY'
NODISCARDFILE
FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
MISSING FIELD VALUES ARE NULL
( rn char(10),
col1 CHAR (10) )
)
LOCATION
( 'datei.csv' )
);
第二名:
CREATE TABLE system.test_datei_csv_utf8
( rn number(10),
col1 VARCHAR2(10 CHAR)
)
ORGANIZATION EXTERNAL
( TYPE ORACLE_LOADER
DEFAULT DIRECTORY "ORDER_ENTRY"
ACCESS PARAMETERS
( RECORDS DELIMITED BY '\n'
STRING SIZES ARE IN CHARACTERS
CHARACTERSET 'UTF8'
TERRITORY 'GERMANY'
NODISCARDFILE
FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
MISSING FIELD VALUES ARE NULL
( rn char(10),
col1 CHAR (200) )
)
LOCATION
( 'datei.csv')
);
第三名:
CREATE TABLE system.test_datei_csv_utf8_in_byte
( rn number(10),
col1 VARCHAR2(10 CHAR)
)
ORGANIZATION EXTERNAL
( TYPE ORACLE_LOADER
DEFAULT DIRECTORY "ORDER_ENTRY"
ACCESS PARAMETERS
( RECORDS DELIMITED BY '\n'
STRING SIZES ARE IN bytes
CHARACTERSET 'UTF8'
TERRITORY 'GERMANY'
NODISCARDFILE
FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
MISSING FIELD VALUES ARE NULL
( rn char(10),
col1 CHAR (10) )
)
LOCATION
( 'datei.csv'
)
);
作为选择的结果,我得到了 12.2:
SQL> select * from system.test_datei_csv_wep1;
RN COL1
12 슰ABCD
SQL> select * from system.test_datei_csv_utf8;
RN COL1
12 슰ABCD
SQL> select * from system.test_datei_csv_utf8_in_byte;
RN COL1
12 슰ABCD
很好。
但是在 18c 上我得到:
SQL> select * from system.test_datei_csv_wep1;
RN COL1
12 ì°ABCD
SQL> select * from system.test_datei_csv_utf8;
RN COL1
12 슰AB
SQL> select * from system.test_datei_csv_utf8_in_byte;
RN COL1
12 슰ABCD
在系统默认外部 table 设置(字符串大小在字符中是默认值)的结果中。test_datei_csv_utf8 CD 丢失。
有人知道新行为是否正确吗?
此致
托马斯
已从 Oracle 修复错误。
可能会包含在下一个 RU 中。
我在 18c 中使用带有 unicode 字符的外部 table 出现了一个奇怪的行为,这在 12.2
之前没有发生过作为测试用例,我创建了一个带有 unicode 字符 + ABCD 的文件:
declare
v_file utl_file.file_type;
v_bas varchar2(20):='ABCD';
begin
v_file := utl_file.fopen('ORDER_ENTRY', 'datei.csv', 'W');
utl_file.put_line(v_file, '12;'||unistr('\C2B0')||v_bas);
utl_file.FFLUSH(v_file);
utl_file.fclose(v_file);
end;
/
为了读取数据,我创建了 3 个不同的外部 tables:
CREATE TABLE system.test_datei_csv_wep1
( rn number(10),
col1 VARCHAR2(10 CHAR)
)
ORGANIZATION EXTERNAL
( TYPE ORACLE_LOADER
DEFAULT DIRECTORY "ORDER_ENTRY"
ACCESS PARAMETERS
( RECORDS DELIMITED BY '\n'
STRING SIZES ARE IN CHARACTERS
CHARACTERSET 'WE8ISO8859P1'
TERRITORY 'GERMANY'
NODISCARDFILE
FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
MISSING FIELD VALUES ARE NULL
( rn char(10),
col1 CHAR (10) )
)
LOCATION
( 'datei.csv' )
);
第二名:
CREATE TABLE system.test_datei_csv_utf8
( rn number(10),
col1 VARCHAR2(10 CHAR)
)
ORGANIZATION EXTERNAL
( TYPE ORACLE_LOADER
DEFAULT DIRECTORY "ORDER_ENTRY"
ACCESS PARAMETERS
( RECORDS DELIMITED BY '\n'
STRING SIZES ARE IN CHARACTERS
CHARACTERSET 'UTF8'
TERRITORY 'GERMANY'
NODISCARDFILE
FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
MISSING FIELD VALUES ARE NULL
( rn char(10),
col1 CHAR (200) )
)
LOCATION
( 'datei.csv')
);
第三名:
CREATE TABLE system.test_datei_csv_utf8_in_byte
( rn number(10),
col1 VARCHAR2(10 CHAR)
)
ORGANIZATION EXTERNAL
( TYPE ORACLE_LOADER
DEFAULT DIRECTORY "ORDER_ENTRY"
ACCESS PARAMETERS
( RECORDS DELIMITED BY '\n'
STRING SIZES ARE IN bytes
CHARACTERSET 'UTF8'
TERRITORY 'GERMANY'
NODISCARDFILE
FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
MISSING FIELD VALUES ARE NULL
( rn char(10),
col1 CHAR (10) )
)
LOCATION
( 'datei.csv'
)
);
作为选择的结果,我得到了 12.2:
SQL> select * from system.test_datei_csv_wep1;
RN COL1
12 슰ABCDSQL> select * from system.test_datei_csv_utf8;
RN COL1
12 슰ABCDSQL> select * from system.test_datei_csv_utf8_in_byte;
RN COL1
12 슰ABCD
很好。 但是在 18c 上我得到:
SQL> select * from system.test_datei_csv_wep1;
RN COL1
12 ì°ABCDSQL> select * from system.test_datei_csv_utf8;
RN COL1
12 슰ABSQL> select * from system.test_datei_csv_utf8_in_byte;
RN COL1
12 슰ABCD
在系统默认外部 table 设置(字符串大小在字符中是默认值)的结果中。test_datei_csv_utf8 CD 丢失。 有人知道新行为是否正确吗?
此致 托马斯
已从 Oracle 修复错误。 可能会包含在下一个 RU 中。