本文档定义 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 (序列方式)
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)
CREATE TABLE example (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(100),
PRIMARY KEY (id)
) AUTO_INCREMENT = 1;
SQLServer (IDENTITY)
CREATE TABLE example (
id INT IDENTITY(1,1) NOT NULL,
name VARCHAR(100),
PRIMARY KEY (id)
);
达梦 (DM8)
-- 方式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)
-- 同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)
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
SELECT * FROM table LIMIT 10 OFFSET 20;
OceanBase
SELECT * FROM table LIMIT 20, 10;
SQLServer
SELECT * FROM table
ORDER BY id
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
达梦 (DM8)
-- 兼容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)
-- 标准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
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_TIMESTAMP、NOW() |
NOW()、CURRENT_TIMESTAMP |
GETDATE()、SYSDATETIME() |
SYSDATE、NOW() |
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 - d2、DATEDIFF(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. 表结构语法
字段注释
-- 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';
索引创建
-- 六库通用基础索引
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)
-- 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);
批量插入数据
六种数据库语法完全通用
INSERT INTO table(col1,col2)VALUES(1,'a'),(2,'b'),(3,'c');
整体总结
- MySQL 与 OceanBase 语法高度同源,分页、自增、更新插入、常用函数基本无差异
- GaussDB 与人大金仓均基于 PostgreSQL 内核,语法互通性最强,迁移改造量最小
- 达梦数据库兼容性最强,同时支持 Oracle、SQLServer、MySQL、PG 主流语法
- SQLServer 私有语法最多,字符拼接、系统时间、分页语法独有的特性多,跨库迁移改写工作量最大
- 基础批量插入、通用索引、CASE 条件判断、基础替换截取函数全数据库通用