我们已经知道Trafodion支持UTF8格式字符集,对于需要存中文的字符类型,我们通过varchar(n) character set utf8定义,举例如下
SQL>create table t(a varchar(10) character set utf8);
--- SQL operation complete.
SQL>showddl t;
CREATE TABLE TRAFODION.SEABASE.T
(
A VARCHAR(10 CHARS) CHARACTER SET UTF8
COLLATE DEFAULT DEFAULT NULL NOT SERIALIZED
)
ATTRIBUTES ALIGNED FORMAT
;
--- SQL operation complete.
通过showddl可以看出,默认情况下varchar(n) character set utf8会定义成VARCHAR(10 CHARS) CHARACTER SET UTF8,实际上,这需要10*3的bytes存储,这是因为一个中文字符在Trafodion中需要占3个字节。
如果UTF8字段中并没有多少中文,这会形成一种巨大的性能的浪费,建议定义成VARCHAR(10 BYTES) CHARACTER SET UTF8,这可以通过表定义时显示定义为”varchar (n bytes) character set utf8”,也可以使用cqd实现,
1 session级别 —cqd TRAF_COL_LENGTH_IS_CHAR ‘OFF’;
SQL>cqd TRAF_COL_LENGTH_IS_CHAR 'OFF';
--- SQL operation complete.
SQL>create table t(a varchar(10) character set utf8);
--- SQL operation complete.
SQL>showddl t;
CREATE TABLE TRAFODION.SEABASE.T
(
A VARCHAR(10 BYTES) CHARACTER SET UTF8
COLLATE DEFAULT DEFAULT NULL NOT SERIALIZED
)
ATTRIBUTES ALIGNED FORMAT
;
--- SQL operation complete.
2 数据库级别 —插入以上cqd到DEFAULTS表并重启DCS生效
insert into "_MD_".defaults values('TRAF_COL_LENGTH_IS_CHAR','OFF','set default utf8 to bytes',0);