记一次项目迁移 mysql 到达梦数据库

249 阅读3分钟

达梦数据库安装

达梦数据库是仿oracle,结构与其类似。有schema,表,表空间等概念。表在schema 下, 表空间是个存储概念,多个表可以存在一个表空间。

SQL

官方文档对 sql 这写的不详细,我只看了大概。字段类型与mysql有些不同,

  • varchar -> varchar
  • longtext,mediumtext,tinytext -> clob
  • datetime -> TIMESTAMP
  • NOW() -> SYSDATE
  • AUTO_INCREMENT -> IDENTITY
  1. 达梦数据库是区分大小写的,在初始化实例时,可以设置成不区分大小写。 这样sql 跟原始sql 接近。mysql语法可直接使用。如果区分大小写,表名,列名,都需要加"", 才能正常运行sql 如: select "name" from tt."tt"

  2. 转义字符,mysql 转义字符是 \ , 达梦中是 ' 。

  3. 字符编码,0 = GB18030,1 = UTF-8,2 = EUC-KR,默认为0

  4. LENGTH_IN_CHAR: varchar类型长度是否以字符为单位,为1表示以字符统计长度,为0以字节统计长度;

  5. 字符长度问题:如果 LENGTH_IN_CHAR = 0, varchar(32)这种,在mysql 中长度是够的,在达梦中长度需要 *3。在mysql中, 用 select length('中') 可以算出字符长度的,达梦中不对,select length(’中‘) 算出的是字符个数,不是长度.

最佳默认配置,大小写不敏感,utf-8,length_in_char = 1

dminit path=/dm/data 
    DB_NAME=DAMENG 
    INSTANCE_NAME=DMSERVER 
    PORT_NUM=5236 
    PAGE_SIZE=32 
    EXTENT_SIZE=32 
    CASE_SENSITIVE=0 
    UNICODE_FLAG=1 
    LENGTH_IN_CHAR=1

  在达梦数据库中,这三个初始化参数在实例初始化时设置。不能修改,若发现选错了,只能重新初始化一个新的实例。

实例初始化

window: 在 tool\dbca.exe, 对实例增删改,实例服务在 window 服务 里,查找 dmService + 实例名,要删除实例时,先要停止实例。

遇到几次实例初始化失败的,也不知道为啥。

开发中遇到的问题

python

在开发过程中遇到的问题, python 为例:

  • 占位符 %s => ?
select * from shenhua_news where id=?
  • 字符串 “” =》 '
select * from shenhua_news where name='xxx'
  • conn.ping(true) 不能用
  • in [] => in ()
select * from bb where id in ('xx','yy')

sql 多个值时 [] => ()

insert_url = 'insert into bb values(?,?,?)'
cursor.execute(insert_url,('aa','bb'))

java 开发

下载驱动

<dependency>
 <groupId>com.dameng</groupId>
 <artifactId>DmJdbcDriver18</artifactId>
 <version>8.1.3.140</version>
</dependency>

或在安装目录: dm\drivers\jdbc, DmJdbcDriver8.jar 是java8对应的驱动包

Druid

spring.datasource.driver-class-name=dm.jdbc.driver.DmDriver
spring.datasource.username=SYSDBA
spring.datasource.password=xxxx
spring.datasource.url=jdbc:dm://xxx:5236?schema=SPIDERFLOW2&keyWords=(XML)
spring.datasource.filters= stat,slf4j

dm.jdbc.driver.DmDriver 是驱动包名,注意大小写,不是dm.jdbc.Driver.DmDriver

jdbc:dm://xxx:5236?schema=SPIDERFLOW2&keyWords=(XML) 表示驱动名,ip,port, schema,过滤的关键词

  • 达梦中关键词有很多,可以用 SELECT * FROM V$RESERVED_WORDS; 查看
  • SP_SET_PARA_STRING_VALUE(2, 'EXCLUDE_RESERVED_WORDS','XML'); 去除关键词,重启数据库才能生效

jdbc:

jdbc:dm://xxx:5236?SPIDERFLOW2  与druid 连接串不同

数据迁移

使用 dm数据迁移工具, 先评估,再迁移,使用时新建 mysql -> dm的迁移。

image.png

总之,达梦数据库能用,但时不时报个错,远没有mysql, sqlserver 那么流畅。迁移的过程要小心,细心,注意大小写,关键词这些问题,也祝大家的迁移之路顺畅。