修改达梦数据库表的char和varchar类型为按字符存储

达梦数据库支持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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

保定公民

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值