在做ETL的时候,经常有一些字段提示长度不够。今天偶抓住一张表来分析了一下,后来发现中文在不同字符集所占用的字节是不同的。详细如下:
源数据库字符集为: ZHS16GBK,数据仓库的字符集为:UTF-8
查询字符集:SELECT * FROM DATABASE_PROPERTIES WHERE property_name = 'NLS_CHARACTERSET'
源数据库:(ZHS16GBK)
SQL
>
SELECT
'
中文
'
, length(
'
中文
'
) x, lengthb(
'
中文
'
) xb
FROM
dual;
' 中文 ' X XB
-- ---- ---------- ----------
中文 2 4
' 中文 ' X XB
-- ---- ---------- ----------
中文 2 4
目标数据库:(UTF8)
SQL
>
SELECT
'
中文
'
, length(
'
中文
'
) x, lengthb(
'
中文
'
) xb
FROM
dual;
' 中文 ' X XB
-- ---------- ---------- ----------
中文 2 6
' 中文 ' X XB
-- ---------- ---------- ----------
中文 2 6
做了一个表测试了一下:
在源数据库里:
SQL
>
create
table
cntable(fname
varchar2
(
4
));
Table created
SQL > insert into cntable(fname) values ( ' 张三 ' );
1 row inserted
Table created
SQL > insert into cntable(fname) values ( ' 张三 ' );
1 row inserted
在目标数据仓库里:
SQL
>
create
table
cntable(fname
varchar2
(
4
));
Table created
SQL > insert into cntable(fname) values ( ' 张三 ' );
insert into cntable(fname) values ( ' 张三 ' )
ORA - 12899 : value too large for column "HUB"."CNTABLE"."FNAME" (actual: 6 , maximum: 4 )
Table created
SQL > insert into cntable(fname) values ( ' 张三 ' );
insert into cntable(fname) values ( ' 张三 ' )
ORA - 12899 : value too large for column "HUB"."CNTABLE"."FNAME" (actual: 6 , maximum: 4 )
很显然中文在UTF8里占3个字节,ZHK里占2个字节。