达梦数据库支持varchar类型按字符存储,在某些异构数据库中,如PG或MySQL中,有些数据类型是按字符为单位存储的,这种异构数据库的数据迁移到达梦的时候,如果不注意,可能会有迁移失败的问题,数据库在达梦不能入库。针对此种类型的数据,达梦提供了两种方式来解决:
1.达梦数据库初始化的时候开启参数length_in_char=1,即varchar类型以字符为单位。
2.先将异构数据库的表结构迁移到达梦,注意迁移前修改达梦数据库对应的兼容性参数(COMPATIBLE_MODE),然后修改达梦数据库中的表结构varchar类型为按字符存储,如varchar(10)修改为varchar(10 char)。
第一种方式在达梦数据库初始化的时候可以直接兼容这种按字符存储的数据,但缺点是该length_in_char参数只是表象上的解决该问题,实际是将数据精度扩大为4倍,因此虽然表面上满足了按字符存储的需求,但是实际上是可以存储多个字符的,有悖于表结构设计的初衷,这种情况下为了严格限制数据符合要求只能再到应用中去做限制。
第二种方式则是严格遵循其他异构数据库表结构设计规范的,缺点就是需要批量对表结构做修改,后续有新增的表时也需要注意建表语句的数据类型设计规范。
使用第二种方式修改表结构时,可以使用以下语句生成待执行的修改SQL,然后批量执行即可
SELECT DISTINCT
'ALTER TABLE "'
||A.OWNER
||'"."'
||A.TABLE_NAME
||'" MODIFY "'
||A.COLUMN_NAME
||'" '
||(CASE A.DATA_TYPE WHEN 'CHAR' THEN 'VARCHAR' ELSE A.DATA_TYPE END)
|| '('
||A.DATA_LENGTH
||' CHAR);'
FROM
DBA_TAB_COLS A
JOIN DBA_OBJECTS B
ON
A.TABLE_NAME=B.OBJECT_NAME
WHERE
A.OWNER ='SCHEMA_NAME'
AND B.OBJECT_TYPE='TABLE'
AND
(
A.DATA_TYPE LIKE 'VARCHAR%'
OR A.DATA_TYPE LIKE 'CHAR%'
);
欢迎访问个人博客Jackin's Blog