【MapSheep】
[好记性不如烂笔头]

MySQL 与达梦(DM)常用语法区别

一、数据类型差异

场景 MySQL 常用类型 达梦(DM)常用类型 说明
整数类型 TINYINT、SMALLINT、INT、BIGINT TINYINT、SMALLINT、INT、BIGINT 基础类型一致,达梦对长度支持更灵活
字符串类型 VARCHAR、TEXT、CHAR VARCHAR、TEXT、CHAR、VARCHAR2 达梦支持 VARCHAR2(兼容 Oracle)
日期时间类型 DATETIME、TIMESTAMP DATE、TIMESTAMP 达梦 DATE 含时分秒,MySQL DATE 仅日期
大字段类型 LONGBLOB、LONGTEXT BLOB、CLOB 达梦用 CLOB 存字符大对象

二、DDL 语句区别

1. 创建数据库

  • MySQL

    CREATE DATABASE db_name 
    CHARACTER SET utf8mb4 
    COLLATE utf8mb4_general_ci;
    
  • 达梦

    CREATE DATABASE db_name 
    CHARACTER SET UTF8; -- 字符集配置逻辑不同
    

2. 创建表(自增主键)

  • MySQL

    CREATE TABLE test (
      id INT AUTO_INCREMENT PRIMARY KEY,
      name VARCHAR(50)
    );
    
  • 达梦

    -- 方式1:序列+触发器(传统方式)
    CREATE TABLE test (
      id INT PRIMARY KEY,
      name VARCHAR(50)
    );
    CREATE SEQUENCE seq_test_id 
    START WITH 1 INCREMENT BY 1;
    
    -- 方式2:IDENTITY自增列(兼容MySQL)
    CREATE TABLE test (
      id INT IDENTITY(1,1) PRIMARY KEY,
      name VARCHAR(50)
    );
    

3. 索引操作

  • 唯一索引(语法一致)

    -- MySQL 与达梦通用
    CREATE UNIQUE INDEX idx_name ON test(name);
    
  • 达梦特有(函数索引)

    CREATE INDEX idx_upper_name 
    ON test(UPPER(name)); -- 支持基于函数的索引
    

三、DML 语句区别

1. 批量插入

  • MySQL:支持多组 VALUES

    INSERT INTO test(name) 
    VALUES('a'), ('b'), ('c');
    
  • 达梦(低版本):需用 UNION ALL

    INSERT INTO test(name)
    SELECT 'a' FROM DUAL UNION ALL
    SELECT 'b' FROM DUAL UNION ALL
    SELECT 'c' FROM DUAL;
    

2. 限制更新/删除行数

  • MySQL:支持 LIMIT

    UPDATE test SET name='d' 
    WHERE id < 10 LIMIT 5;
    
    DELETE FROM test 
    WHERE id < 10 LIMIT 5;
    
  • 达梦:需用子查询

    UPDATE test SET name='d' 
    WHERE id IN (
      SELECT id FROM test 
      WHERE id < 10 
      FETCH FIRST 5 ROWS ONLY
    );
    

四、查询语句区别

1. 分页查询

  • MySQL:使用 LIMIT

    SELECT * FROM test 
    ORDER BY id 
    LIMIT 10, 20; -- 从第10行起取20行
    
  • 达梦:使用 FETCH FIRST

    SELECT * FROM test 
    ORDER BY id 
    OFFSET 10 ROWS 
    FETCH FIRST 20 ROWS ONLY;
    

2. 字符串拼接

  • MySQL:用 CONCAT()

    SELECT CONCAT(name, '_', id) 
    FROM test;
    
  • 达梦:支持 || 运算符

    SELECT name || '_' || id 
    FROM test;
    

3. 日期函数

功能 MySQL 语法 达梦语法
获取当前时间 NOW() / CURRENT_TIMESTAMP() SYSDATE / CURRENT_TIMESTAMP
日期格式化 DATE_FORMAT(NOW(), '%Y-%m-%d') TO_CHAR(SYSDATE, 'YYYY-MM-DD')

五、其他常用区别

场景 MySQL 特性 达梦特性
注释符 支持 #、-- 、/* */ 支持 -- 、/* */(不支持 #)
事务提交方式 默认自动提交 默认手动提交
空值处理 '' 与 NULL 不同 '' 与 NULL 等价
存储过程变量声明 DECLARE var INT; 语法一致,支持更多类型

六、迁移注意事项

  1. 达梦可通过 COMPATIBLE_MODE=4 配置模拟 MySQL 行为,减少适配成本
  2. 自增列、分页逻辑、日期函数是迁移的核心差异点
  3. 达梦更兼容 Oracle 语法,序列、触发器等用法与 Oracle 类似

以上内容涵盖日常开发中最常见的语法差异,迁移时建议结合具体版本的官方文档验证。

posted on 2025-07-25 14:45  (Play)  阅读(226)  评论(0)    收藏  举报