收藏干货:MySQL/PG/人大金仓/达梦语法差异对照表
📌 专栏:国产数据库信创实战
🔖 标签:#数据库语法差异 #MySQL转人大金仓 #MySQL转达梦 #PG语法适配 #信创数据库迁移 #SQL兼容改造 #国产数据库适配 #SpringBoot3数据库适配
📝 文章摘要
信创国产化迁移过程中,数据库语法不兼容是开发人员最头疼的问题:SQL运行报错、内置函数失效、分页逻辑异常、字段类型映射失败、时间格式化错乱等现象频繁出现,严重拖慢项目适配上线进度。
本文全面整理了MySQL、PostgreSQL、人大金仓 V9、达梦 DM9四大企业级主流数据库的最全语法差异对照表,深度覆盖分页查询、自增主键、字符串处理、时间日期函数、字段数据类型、空值逻辑、条件判断、分组排序、批量操作等后端开发高频业务场景。表格清晰对比、写法可直接套用,项目迁移改造对照修改即可快速适配。建议开发人员收藏备用,可大幅降低国产化数据库适配难度,提升项目落地效率。
一、前言:国产化迁移语法兼容痛点 🎯
如今政企项目全面推进信创国产化改造,大量传统MySQL、Oracle业务系统,开始向人大金仓、达梦等国产数据库迁移。绝大多数 Java 后端业务逻辑、接口代码无需改动,但90% 的线上报错、开发调试问题均来源于 SQL 语法不兼容。
日常开发中常见兼容难题:
❌分页错乱:MySQL 经典双参数分页
LIMIT 起始,条数,在人大金仓、PostgreSQL 直接执行报错。❌函数失效:各数据库时间格式化函数命名不统一,
DATE_FORMAT、TO_CHAR混用导致时间查询为空。❌主键冲突:自增主键创建语法不一致,项目新增数据无法自动生成主键ID,业务新增功能瘫痪。
❌类型错误:大文本、长文本、浮点数值类型映射错误,建表语句执行失败。
❌结果异常:字符串截取、拼接、长度统计函数执行结果不一致,引发业务数据统计异常。
❌框架不适:框架分页插件方言不匹配,导致分页总数错误、分页数据重复缺失。
为解决后端开发、运维调试、项目信创整改、数据库平滑迁移等实际工作需求,特此整理这份全场景数据库语法差异对照表。语句写法简洁直观,可直接复制使用,是国产化开发必备的常备干货文档。
二、基础环境与数据库定位说明 🗺️
| 数据库类型 | 版本 | 项目定位说明 | 主流适用场景 |
|---|---|---|---|
| MySQL | 5.7 / 8.0 | 互联网通用开源数据库,语法简洁轻量化,生态成熟,学习门槛低 | 互联网项目、中小型业务系统、传统后台管理系统 |
| PostgreSQL | 12 / 13 / 15 | 开源企业级高级关系型数据库,拓展性极强,SQL 标准兼容性高 | 大数据分析、GIS 地理信息、开源架构项目 |
| 人大金仓 V9 | V9 全系列 | 基于 PostgreSQL 内核深度定制优化的国产数据库,双兼容 PG+MySQL 语法 | 政务系统、事业单位、国企信创项目、国产化政务平台 |
| 达梦 DM9 | DM9 最新稳定版 | 完全自研内核国产数据库,高度对标 Oracle 语法,安全等级高 | 金融行业、军工涉密、国企核心业务、Oracle 迁移项目 |
三、核心语法最全差异对照表 📚
3.1 分页查询语法差异(开发最高频) 📄
分页是后端接口使用频率最高的 SQL 语法,也是数据库迁移最容易出错的场景。
| 使用场景 | MySQL | PostgreSQL / 人大金仓 V9 | 达梦 DM9 |
|---|---|---|---|
| 基础分页语句 | SELECT * FROM user LIMIT 0,10 | SELECT * FROM user LIMIT 10 OFFSET 0 | 双语法兼容:LIMIT 0,10或LIMIT 10 OFFSET 0 |
| 后端动态分页 | LIMIT #{pageStart}, #{pageSize} | LIMIT #{pageSize} OFFSET #{pageStart} | 直接沿用 MySQL 分页写法,无任何报错 |
| 排序分页 | 支持ORDER BY后直接拼接LIMIT | 标准LIMIT + OFFSET排序分页 | 兼容全类型排序分页语法 |
| 框架适配建议 | 原生写法通用 | 统一改为 OFFSET 标准分页格式 | 无需改动,适配性最优 |
✅ 核心总结:人大金仓严格遵循 PG 标准分页语法,禁止直接使用 MySQL 逗号分页;达梦全面兼容 MySQL 分页语法,迁移无需改动分页 SQL。
3.2 自增主键创建与序列用法差异 🔢
自增主键用于数据表唯一 ID 生成,是新增业务核心必备语法。
| 数据库 | 建表自增主键标准写法 | 序列手动创建用法 |
|---|---|---|
| MySQL | id INT PRIMARY KEY AUTO_INCREMENT | 无原生序列,依赖自增字段 |
| PostgreSQL | id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY | 支持SERIAL简易自增,推荐IDENTITY标准写法 |
| 人大金仓 V9 | id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY | 完全兼容 PG 序列创建、调用语法 |
| 达梦 DM9 | id INT PRIMARY KEY IDENTITY(1,1) | 自主研发序列语法,高度对标 Oracle 序列 |
💡 实用备注:人大金仓与 PostgreSQL 推荐使用
IDENTITY自增列,其稳定性、可移植性远高于传统的SERIAL类型,适配信创项目生产环境。
3.3 常用字符串处理函数 🔤
日常用户名、昵称、地址、备注等字符串字段处理的高频函数。
| 实现功能 | MySQL | PG / 人大金仓 V9 | 达梦 DM9 |
|---|---|---|---|
| 字符串截取 | SUBSTR(str, start, len) | SUBSTRING(str, start, len) | 完全兼容 MySQLSUBSTR函数 |
| 字符串拼接 | CONCAT(a, b, c) | a || b | CONCAT、||双写法通用 |
| 字符长度统计 | CHAR_LENGTH(str) | CHAR_LENGTH(str) | LENGTH/CHAR_LENGTH均可 |
| 首尾空格去除 | TRIM(str) | TRIM(str) | 全数据库通用,无差异 |
| 英文字母大写 | UPPER(str) | UPPER(str) | 通用 |
| 英文字母小写 | LOWER(str) | LOWER(str) | 通用 |
⚠️ 重要避坑:MySQL中
LENGTH()统计字节长度,中文单字占 3 个字节;PG、人大金仓、达梦中LENGTH()默认统计字符长度。多字符业务统一使用CHAR_LENGTH()以避免统计数据出错。
3.4 时间日期函数与日期运算差异 🗓️
时间筛选、时间统计、创建时间、更新时间等业务必备语法。
| 实现功能 | MySQL | PG / 人大金仓 V9 | 达梦 DM9 |
|---|---|---|---|
| 获取系统当前时间 | NOW() | NOW()、CURRENT_TIMESTAMP | SYSDATE()、NOW()全部支持 |
| 日期格式化 | DATE_FORMAT(ctime, '%Y-%m-%d') | TO_CHAR(ctime, 'YYYY-MM-DD') | 兼容DATE_FORMAT与TO_CHAR双格式 |
| 日期增加天数 | DATE_ADD(ctime, INTERVAL 1 DAY) | ctime + INTERVAL '1 day' | DATEADD函数 + 日期直接运算均支持 |
| 日期减少天数 | DATE_SUB(ctime, INTERVAL 1 DAY) | ctime - INTERVAL '1 day' | 全语法兼容 |
| 单独获取年份 | YEAR(ctime) | EXTRACT(YEAR FROM ctime) | YEAR函数通用 |
| 单独获取月份 | MONTH(ctime) | EXTRACT(MONTH FROM ctime) | MONTH函数通用 |
| 单独获取日期 | DAY(ctime) | EXTRACT(DAY FROM ctime) | DAY函数通用 |
3.5 常用数据字段类型映射对照表 🧱
数据表建表核心,迁移项目建表语句应优先对照映射,杜绝建表失败。
| MySQL 字段类型 | 人大金仓 / PG 适配类型 | 达梦 DM9 适配类型 | 业务使用场景 |
|---|---|---|---|
VARCHAR(n) | VARCHAR(n) | VARCHAR(n) | 短文本、账号、手机号、名称 |
INT | INTEGER | INT | 普通整型状态、排序、分类 |
BIGINT | BIGINT | BIGINT | 主键 ID、大数值编号 |
TINYINT | SMALLINT | TINYINT | 状态字段:启用、禁用、删除 |
TEXT | TEXT | TEXT / CLOB | 长文本、备注、详情内容 |
DATETIME | TIMESTAMP | DATETIME | 创建时间、更新时间、业务时间 |
DOUBLE | DOUBLE PRECISION | DOUBLE | 普通浮点金额、数值统计 |
DECIMAL(p,s) | NUMERIC(p,s) | DECIMAL(p,s) | 财务金额、精准小数计算 |
3.6 空值判断、布尔值逻辑语法差异 ☑️
业务筛选、条件过滤高频逻辑判断。
| 判断逻辑 | MySQL | 金仓 / PG | 达梦 |
|---|---|---|---|
| 判断字段为空 | IS NULL | IS NULL | IS NULL |
| 判断字段非空 | IS NOT NULL | IS NOT NULL | IS NOT NULL |
| 空字符串判定 | '' | '' | '' |
| 布尔真标识 | TRUE / 1 | TRUE | TRUE |
| 布尔假标识 | FALSE / 0 | FALSE | FALSE |
✅ 统一结论:三大国产 + 开源主流数据库,空值判断语法完全统一,项目迁移无需修改空值判断逻辑。
3.7 别名、分组、排序、去重通用语法 📊
此类基础 SQL 语法全平台高度统一,无任何适配成本。
表别名、字段别名:
SELECT u.name FROM user u四大数据库通用;分组查询
GROUP BY、条件筛选HAVING语法完全一致;升降序排序
ORDER BY 字段 ASC/DESC无需改动;数据去重
DISTINCT关键字全数据库通用;多表联查
LEFT JOIN、INNER JOIN、RIGHT JOIN写法统一。
3.8 行内条件 IF 判断语句写法差异 🔀
查询字段动态赋值、状态转义常用语法。
| 条件判断写法 | MySQL | 金仓 / PG | 达梦 |
|---|---|---|---|
| 行内三元判断 | IF(sex=1, '男', '女') | 仅支持CASE WHEN | 同时支持IF函数 +CASE WHEN |
| 标准通用写法 | CASE WHEN | CASE WHEN | CASE WHEN |
💡 全网通用最优写法:所有数据库统一使用
CASE WHEN语法,一次编写全库适配,彻底规避函数不兼容问题。sql
CASE WHEN sex = 1 THEN '男' WHEN sex = 2 THEN '女' ELSE '未知' END
3.9 行数限制、批量插入、批量更新语法 📥
1. 查询行数限制
MySQL:仅支持
LIMIT关键字人大金仓 / PG:标准
LIMIT语法达梦:支持
TOP、LIMIT、ROWNUM三种写法,兼容性最强
2. 批量插入语句
INSERT INTO sys_user (id, name, status) VALUES (1, '张三', 1), (2, '李四', 1);✅ 四大数据库语法完全一致,批量新增业务无需任何修改。
3. 批量更新语法
关联更新、子查询更新的主流写法全平台兼容,仅需注意字段类型匹配即可。
四、MyBatis/MyBatis-Plus 框架适配写法 ⚙️
分页插件适配
MySQL 项目:使用
MySQL分页插件方言。人大金仓项目:指定
PostgreSQL方言,自动适配OFFSET分页。达梦项目:可直接使用
MySQL方言,或配置达梦专属方言。
XML SQL 编写规范
新项目信创开发:优先采用PG 标准 SQL 写法,适配人大金仓。
老项目迁移改造:达梦可保留原有MySQL SQL,大幅减少改造成本。
禁止在通用 Mapper 中使用数据库独有专属函数。
五、迁移快速适配通用规则(分场景) 🧭
MySQL 项目迁移至人大金仓 🔄
分页 SQL 全部改造:
LIMIT m,n→LIMIT n OFFSET m时间格式化
DATE_FORMAT统一替换为TO_CHAR数据表自增主键替换为
IDENTITY自增格式舍弃 MySQL 专属函数,使用 SQL 标准通用函数
MySQL 项目迁移至达梦数据库 ✅
95% 以上业务 SQL 无需修改,语法高度兼容
仅调整
TEXT、大字段等少数字段类型即可上线分页、时间、字符串函数全部兼容,适配效率最高
Oracle 项目迁移至国产数据库 🏦
金融、国企 Oracle 老系统:优先选择达梦,语法几乎零改动
政务 Oracle 小型系统:可迁移人大金仓,批量改写 Oracle 专属存储过程
政企新项目开发统一规范 🏗️
政务类新项目:直接使用人大金仓 + PG 标准 SQL 语法
金融核心新项目:直接使用达梦数据库,沿用 Oracle 开发习惯
六、项目实战迁移高频避坑要点 ⚠️
💣人大金仓项目尽量少使用 MySQL 专属语法函数,线上生产环境极易出现隐性报错。
💣达梦数据库尽量不要大量编写复杂 Oracle 存储过程,后期运维、版本升级兼容性较差。
💡 批量插入、批量删除等基础 DML 语句全库通用,无需花费时间改造。
☕SpringBoot3项目适配国产数据库,仅修改驱动类、连接URL、数据库方言三大配置,Java 业务代码无需改动。
🕒 时间字段统一使用
TIMESTAMP/DATETIME,禁止混用字符串存储时间,避免查询排序异常。🛡️ 信创等保项目,优先统一字段长度、字符集,全部统一为UTF-8,杜绝乱码问题。
📝 避免使用数据库冷门独有语法,保持 SQL 通用性,方便后期数据库横向切换。
七、主流数据库驱动与方言配置参考 🔌
1. 人大金仓 V9 配置
spring: datasource: driver-class-name: com.kingbase8.Driver url: jdbc:kingbase8://127.0.0.1:54321/db_name mybatis-plus: configuration: db-config: db-type: postgresql # 关键!方言指定为PG2. 达梦 DM9 配置
spring: datasource: driver-class-name: dm.jdbc.driver.DmDriver url: jdbc:dm://127.0.0.1:5236/db_name mybatis-plus: configuration: db-config: db-type: mysql # 或达梦专属方言3. MySQL 标准配置
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/db_name八、文末总结与专栏引流 🌟
本文整合整理了MySQL、PostgreSQL、人大金仓 V9、达梦 DM9四大主流数据库的全套语法差异内容,覆盖后端日常开发 99% 以上的 SQL 编写、数据表创建、业务逻辑查询场景。不管是个人开发学习、企业项目信创国产化迁移、线上问题排查,还是后端面试知识点梳理,都可以直接查阅使用。建议开发者一键收藏,工作学习随时调取对照。
🔮 后续本专栏将持续更新更多信创国产化实战干货:
SpringBoot3 整合人大金仓、达梦完整实战配置教程
国产数据库 SQL 性能优化实战方案
政企信创项目全流程数据库迁移落地文档
人大金仓、达梦高频报错原因分析与终极解决方案
国产数据库分库分表、读写分离实战教程
专注深耕SpringBoot3 + 国产数据库信创实战领域,分享一线项目落地经验,拒绝空洞理论,只输出可直接上线使用的实战干货。如果觉得本文对你有帮助,欢迎点赞、收藏、关注,后续干货内容不迷路!
