数据库语法对比详细规则

本文档定义 GaussDB、OceanBase、SQLServer、达梦 (DM8)、人大金仓 (KingbaseES)、MySQL 六种数据库之间的语法差距。

1. 数据类型映射

数据类型 GaussDB OceanBase SQLServer 达梦 (DM8) 人大金仓 (KingbaseES) MySQL
整数 INT / INTEGER INT INT INT / INTEGER INT / INTEGER INT
长整数 BIGINT BIGINT BIGINT BIGINT BIGINT BIGINT
小整数 SMALLINT SMALLINT SMALLINT SMALLINT SMALLINT SMALLINT
浮点 NUMERIC(p,s) DECIMAL(p,s) DECIMAL(p,s) DECIMAL(p,s) / NUMERIC(p,s) NUMERIC(p,s) DECIMAL(p,s)
字符串 (定长) CHAR(n) CHAR(n) CHAR(n) CHAR(n) CHAR(n) CHAR(n)
字符串 (变长) VARCHAR(n) VARCHAR(n) VARCHAR(n) / NVARCHAR(n) VARCHAR(n) / VARCHAR2(n) VARCHAR(n) VARCHAR(n)
大文本 TEXT TEXT / LONGTEXT NVARCHAR(MAX) / TEXT TEXT / CLOB TEXT TEXT / LONGTEXT
日期 DATE DATE DATE DATE DATE DATE
时间 TIME TIME TIME TIME TIME TIME
日期时间 TIMESTAMP DATETIME DATETIME / DATETIME2 TIMESTAMP / DATETIME TIMESTAMP DATETIME / TIMESTAMP
布尔 BOOLEAN TINYINT(1) BIT BIT BOOLEAN TINYINT(1)
二进制 BYTEA BLOB VARBINARY(MAX) BLOB / VARBINARY BYTEA BLOB / LONGBLOB
JSON JSON / JSONB JSON NVARCHAR(MAX) JSON JSON / JSONB JSON

2. 自增主键

GaussDB (序列方式)

sql 复制代码
CREATE SEQUENCE table_id_seq START WITH 1 INCREMENT BY 1;
CREATE TABLE example (
    id INT NOT NULL DEFAULT nextval('table_id_seq'),
    name VARCHAR(100),
    PRIMARY KEY (id)
);

OceanBase (AUTO_INCREMENT)

sql 复制代码
CREATE TABLE example (
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(100),
    PRIMARY KEY (id)
) AUTO_INCREMENT = 1;

SQLServer (IDENTITY)

sql 复制代码
CREATE TABLE example (
    id INT IDENTITY(1,1) NOT NULL,
    name VARCHAR(100),
    PRIMARY KEY (id)
);

达梦 (DM8)

sql 复制代码
-- 方式1:IDENTITY 兼容SQLServer
CREATE TABLE example (
    id INT IDENTITY(1,1) NOT NULL,
    name VARCHAR(100),
    PRIMARY KEY (id)
);

-- 方式2:序列
CREATE SEQUENCE table_id_seq START WITH 1 INCREMENT BY 1;
CREATE TABLE example (
    id INT NOT NULL DEFAULT table_id_seq.NEXTVAL,
    name VARCHAR(100),
    PRIMARY KEY (id)
);

人大金仓 (KingbaseES)

sql 复制代码
-- 同PostgreSQL,序列/IDENTITY 双支持
CREATE TABLE example (
    id INT GENERATED AS IDENTITY,
    name VARCHAR(100),
    PRIMARY KEY (id)
);

-- 序列方式
CREATE SEQUENCE table_id_seq START WITH 1 INCREMENT BY 1;
CREATE TABLE example (
    id INT NOT NULL DEFAULT nextval('table_id_seq'),
    name VARCHAR(100),
    PRIMARY KEY (id)
);

MySQL (AUTO_INCREMENT)

sql 复制代码
CREATE TABLE example (
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(100),
    PRIMARY KEY (id)
) AUTO_INCREMENT = 1;

转换规则

  • 其他库 → MySQL:IDENTITY/nextval/ 序列 → 统一改为 AUTO_INCREMENT
  • MySQL → 其他库:AUTO_INCREMENT → Gauss / 金仓用序列,达梦用 IDENTITY / 序列,SQLServer 用 IDENTITY

3. 分页查询

GaussDB

sql 复制代码
SELECT * FROM table LIMIT 10 OFFSET 20;

OceanBase

sql 复制代码
SELECT * FROM table LIMIT 20, 10;

SQLServer

sql 复制代码
SELECT * FROM table 
ORDER BY id 
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

达梦 (DM8)

sql 复制代码
-- 兼容Oracle/PG/SQLServer
SELECT * FROM table WHERE ROWNUM <=10;
-- 标准分页
SELECT * FROM table LIMIT 10 OFFSET 20;
-- 兼容SQLServer
SELECT * FROM table ORDER BY id OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

人大金仓 (KingbaseES)

sql 复制代码
-- 标准PG语法
SELECT * FROM table LIMIT 10 OFFSET 20;
-- 兼容Oracle
SELECT * FROM (SELECT t.*,ROWNUM rn FROM table t) WHERE rn BETWEEN 21 AND 30;

MySQL

sql 复制代码
SELECT * FROM table LIMIT 20, 10;
-- 标准写法
SELECT * FROM table LIMIT 10 OFFSET 20;

转换规则

  • MySQL ↔ OceanBase:分页语法完全一致
  • MySQL → Gauss / 金仓 / 达梦:LIMIT m,n 改为 LIMIT n OFFSET m
  • MySQL → SQLServer:改为 OFFSET m ROWS FETCH NEXT n ROWS ONLY

4. 字符串函数

功能 GaussDB OceanBase SQLServer 达梦 (DM8) 人大金仓 (KingbaseES) MySQL
字符串拼接 `a b` CONCAT(a, b) a + b CONCAT() 或 `
获取字符串长度 LENGTH(s) LENGTH(s)CHAR_LENGTH(s) LEN(s) LENGTH(s) LENGTH(s) LENGTH(s)CHAR_LENGTH(s)
字符串截取 SUBSTRING(s, start, len) SUBSTRING(s, start, len) SUBSTRING(s, start, len) SUBSTRING(s, start, len) SUBSTRING(s, start, len) SUBSTRING(s, start, len)
左侧截取 LEFT(s, n) LEFT(s, n) LEFT(s, n) LEFT(s, n) LEFT(s, n) LEFT(s, n)
右侧截取 RIGHT(s, n) RIGHT(s, n) RIGHT(s, n) RIGHT(s, n) RIGHT(s, n) RIGHT(s, n)
去除首尾空格 TRIM(s) TRIM(s) LTRIM(RTRIM(s)) TRIM(s) TRIM(s) TRIM(s)
转大写 UPPER(s) UPPER(s) UPPER(s) UPPER(s) UPPER(s) UPPER(s)
转小写 LOWER(s) LOWER(s) LOWER(s) LOWER(s) LOWER(s) LOWER(s)
字符串替换 REPLACE(s, a, b) REPLACE(s, a, b) REPLACE(s, a, b) REPLACE(s, a, b) REPLACE(s, a, b) REPLACE(s, a, b)
查找字符位置 POSITION(sub IN s) LOCATE(sub, s)INSTR(s, sub) CHARINDEX(sub, s) INSTR(s, sub)CHARINDEX POSITION(sub IN s)INSTR INSTR(s, sub)LOCATE

5. 日期时间函数

功能 GaussDB OceanBase SQLServer 达梦 (DM8) 人大金仓 (KingbaseES) MySQL
获取当前日期时间 CURRENT_TIMESTAMPNOW() NOW()CURRENT_TIMESTAMP GETDATE()SYSDATETIME() SYSDATENOW() NOW()CURRENT_TIMESTAMP NOW()SYSDATE()
获取当前日期 CURRENT_DATE CURDATE() CAST(GETDATE() AS DATE) TRUNC(SYSDATE) CURRENT_DATE CURDATE()
日期格式化 TO_CHAR(d, 'YYYY-MM-DD') DATE_FORMAT(d, '%Y-%m-%d') FORMAT(d, 'yyyy-MM-dd') TO_CHAR(d, 'YYYY-MM-DD') TO_CHAR(d, 'YYYY-MM-DD') DATE_FORMAT(d, '%Y-%m-%d')
字符串转日期 TO_DATE(s, 'YYYY-MM-DD') STR_TO_DATE(s, '%Y-%m-%d') CONVERT(DATE, s, 23) TO_DATE(s, 'YYYY-MM-DD') TO_DATE(s, 'YYYY-MM-DD') STR_TO_DATE(s, '%Y-%m-%d')
日期加减运算 d + INTERVAL '1 day' DATE_ADD(d, INTERVAL 1 DAY) DATEADD(DAY, 1, d) DATEADD(d, 1, 'DAY') d + INTERVAL '1 day' DATE_ADD(d, INTERVAL 1 DAY)
计算日期差值 d1 - d2 DATEDIFF(d1, d2) DATEDIFF(DAY, d2, d1) DATEDIFF(d1, d2) d1 - d2DATEDIFF(d1,d2) DATEDIFF(d1, d2)
提取年份 EXTRACT(YEAR FROM d) YEAR(d) YEAR(d) YEAR(d)EXTRACT(YEAR FROM d) EXTRACT(YEAR FROM d) YEAR(d)
提取月份 EXTRACT(MONTH FROM d) MONTH(d) MONTH(d) MONTH(d) EXTRACT(MONTH FROM d) MONTH(d)
提取日期 EXTRACT(DAY FROM d) DAY(d) DAY(d) DAY(d) EXTRACT(DAY FROM d) DAY(d)

6. 条件函数

功能 GaussDB OceanBase SQLServer 达梦 (DM8) 人大金仓 (KingbaseES) MySQL
空值替换 COALESCE(a, b) IFNULL(a, b)COALESCE(a, b) ISNULL(a, b)COALESCE(a, b) NVL(a, b)COALESCE(a, b) COALESCE(a, b)NVL(a, b) IFNULL(a,b)COALESCE(a,b)
多条件判断 CASE WHEN ... THEN ... END CASE WHEN ... THEN ... END CASE WHEN ... THEN ... END CASE WHEN ... THEN ... END CASE WHEN ... THEN ... END CASE WHEN ... THEN ... END
简易 IF 判断 CASE WHEN cond THEN a ELSE b END IF(cond, a, b) IIF(cond, a, b) IF(cond, a, b)CASE CASE WHEN cond THEN a ELSE b END IF(cond, a, b)
相等置空 NULLIF(a, b) NULLIF(a, b) NULLIF(a, b) NULLIF(a, b) NULLIF(a, b) NULLIF(a, b)

7. 聚合与分组函数

功能 GaussDB OceanBase SQLServer 达梦 (DM8) 人大金仓 (KingbaseES) MySQL
字符串行转列聚合 STRING_AGG(col, ',') GROUP_CONCAT(col SEPARATOR ',') STRING_AGG(col, ',') WM_CONCAT(col)STRING_AGG STRING_AGG(col, ',') GROUP_CONCAT(col SEPARATOR ',')
去重统计数量 COUNT(DISTINCT col) COUNT(DISTINCT col) COUNT(DISTINCT col) COUNT(DISTINCT col) COUNT(DISTINCT col) COUNT(DISTINCT col)

8. 表结构语法

字段注释

sql 复制代码
-- GaussDB / 达梦 / 人大金仓
COMMENT ON COLUMN table.col IS '注释';

-- OceanBase / MySQL
col VARCHAR(100) COMMENT '注释';

-- SQLServer
EXEC sp_addextendedproperty 'MS_Description','注释','SCHEMA','dbo','TABLE','table','COLUMN','col';

索引创建

sql 复制代码
-- 六库通用基础索引
CREATE INDEX idx_name ON table(col);

-- 人大金仓 指定索引类型
CREATE INDEX idx_name ON table USING btree(col);

-- 达梦 聚集索引
CREATE CLUSTER INDEX idx_name ON table(col);

9. 特殊语法

插入或更新(UPSERT)

sql 复制代码
-- GaussDB、人大金仓
INSERT INTO t VALUES(1,'test') ON CONFLICT(id) DO UPDATE SET name=EXCLUDED.name;

-- OceanBase、MySQL
INSERT INTO t VALUES(1,'test') ON DUPLICATE KEY UPDATE name=VALUES(name);

-- SQLServer、达梦
MERGE INTO t USING(VALUES(1,'test')) s ON t.id=s.id
WHEN MATCHED THEN UPDATE SET name=s.name
WHEN NOT MATCHED THEN INSERT(id,name)VALUES(s.id,s.name);

批量插入数据

六种数据库语法完全通用

sql 复制代码
INSERT INTO table(col1,col2)VALUES(1,'a'),(2,'b'),(3,'c');

整体总结

  1. MySQL 与 OceanBase 语法高度同源,分页、自增、更新插入、常用函数基本无差异
  2. GaussDB 与人大金仓均基于 PostgreSQL 内核,语法互通性最强,迁移改造量最小
  3. 达梦数据库兼容性最强,同时支持 Oracle、SQLServer、MySQL、PG 主流语法
  4. SQLServer 私有语法最多,字符拼接、系统时间、分页语法独有的特性多,跨库迁移改写工作量最大
  5. 基础批量插入、通用索引、CASE 条件判断、基础替换截取函数全数据库通用
相关推荐
祈禾1 小时前
Redis三大缓存问题与分布式锁
运维·数据库·redis·笔记·分布式·缓存
DBA小马哥2 小时前
关系型数据库核心概念手册:SQL、事务与存储引擎的技术脉络
数据库·sql
丫头,冲鸭!!!2 小时前
记账网站3-连数据库
数据库·个人开发
灯澜忆梦2 小时前
【MySQL12】进阶篇 | SQL优化
数据库·sql·mysql·性能优化
IvorySQL2 小时前
PostgreSQL 日报|PG18.5 回归测试崩溃问题(8 月 12 日)
大数据·数据库·人工智能·postgresql
ltl3 小时前
学习型查询优化器:Neo、Bao、Balsa 与 LLM-CBO
数据库
ltl3 小时前
持久内存退场之后:ZNS SSD 与下一代非易失内存
数据库
故乡dee云5 小时前
AWS 产品太多不会选?按“网站、数据库、文件、日志”4 类需求快速匹配
数据库·云计算·aws
曹牧7 小时前
C#:问号
前端·数据库·c#
奇树谦7 小时前
《现代 Key-Value 数据库原理:从 B+Tree 到 LSM Tree》-第五篇:现代数据库横向对比
数据库·lsm-tree