为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】: v8 最新版
【操作系统】:任意
【CPU】: 任意
【问题描述】*:数据库源信息数据有问题
目标测试表结构
create table tb_dm_types_for_v8_2
(
c_id bigint primary key,
c_character_varying character varying(24),
c_character_varying_b character varying(24 byte),
c_character_varying_c character varying(24 char),
c_char_varying char varying(24),
c_char_varying_b char varying(24 byte),
c_char_varying_c char varying(24 char)
);
查询元信息所使用的 SQL 语句
select TABLE_NAME,COLUMN_NAME,DATA_TYPE,COLUMN_ID,DATA_LENGTH,CHAR_LENGTH,DATA_PRECISION,DATA_SCALE
from SYS.DBA_TAB_COLS COLS
where TABLE_NAME in ('TB_DM_TYPES_FOR_V8_2')
order by COLUMN_ID asc
查询结果
其中列 c_character_varying_c 和 c_char_varying_c 说能存 48个字符,试了不行仍然只能存 24个字符。 CHAR_LENGTH 字段在这种情况下没有数据。
-- 补充一下 character/varchar/varchar2/nvarchar 上述情况可以使用 CHAR_LENGTH 字段获取到真实值。
数据库运行结果符合预期,但是程序这边需要基于这个元信息中的长度数据。导致程序在这个情况下就无法正常工作了。
请问如何才能得到列可以存储数据的真实长度? 那个 48 是如何得来的?
搜了达梦 DBA 手册开发手册中没有找到 DBA_COL_COMMENTS、DBA_TAB_COLS 这两个 oracle 兼容表的数据字典描述。
character varying(24)和character varying(24 byte)都是可以存储24个字节
这里data_length查询结果是最大字节数
character varying(24 char)可以存储24个字符,在gbk下一个汉字占2个字节,所以查询出的长度是48;在utf8下一个汉字占3个字节,想要存储24个字符的话会扩大4倍,所以data_length查询结果会是96