MySQL迁移到瀚高数据库 常用转换函数对照表(附XML示例,直接复用)

前言:

在MySQL转瀚高数据库的实际开发中,多数开发者会卡在XML SQL(MyBatis mapper.xml、Spring XML配置SQL)的语法适配环节。瀚高数据库基于PostgreSQL内核开发,XML框架标签(、等)无需修改,核心差异集中在MySQL与PostgreSQL的函数语法上。本文整理了高频场景下的转换函数对照表,附XML示例,复制即可替换使用,帮大家避开踩坑点、提升转换效率。

一、前置说明(必看)

  1. 适配前提:瀚高数据库需替换MySQL JDBC驱动为瀚高驱动(com.highgo:highgo-jdbc),URL格式改为jdbc:highgo://ip:port/dbname?user=xxx&password=xxx,与PostgreSQL兼容。

  2. 核心原则:XML中的框架标签(MyBatis/Spring)用法完全不变,仅需替换SQL语句中的函数;优先使用兼容函数,减少修改成本。

  3. 避坑重点:日期格式化符、字符串拼接、空值处理是高频踩坑点,下文会重点标注差异,务必注意区分。

  4. 相关依赖

bash 复制代码
<!-- postgresql驱动 -->
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
</dependency>

<dependency>
    <groupId>com.highgo</groupId>
    <artifactId>HgdbJdbc</artifactId>
    <version>6.2.3</version>
</dependency>
  1. yml分页配置修改如下
bash 复制代码
pagehelper:
  helperDialect: postgresql
  reasonable: true
  supportMethodsArguments: true
  params: count=countSql

二、高频转换函数对照表(按功能分类)

说明:以下表格均按「功能描述→MySQL函数→瀚高函数→XML示例对比」整理,示例可直接复制到项目中替换,无需额外调整框架标签。
(一)字符串相关转换(最常用)

字符串操作是XML SQL中最频繁的场景,瀚高支持部分MySQL函数,但拼接、分组拼接等需重点修改,推荐使用瀚高原生语法提升性能。

功能描述 MySQL 函数/语法 瀚高(PostgreSQL)函数/语法 XML示例对比(直接复用)
字符串拼接(多参数) CONCAT(a, b, c) CONCAT(a, b, c) MySQL:CONCAT('%', #{name}, '%')瀚高:'%'
分组拼接(聚合场景) GROUP_CONCAT(col SEPARATOR ',') STRING_AGG(col, ',') MySQL:GROUP_CONCAT(role SEPARATOR ',') AS roles瀚高:STRING_AGG(role, ',') AS roles
字符串转大小写 LOWER(str) / UPPER(str) LOWER(str) / UPPER(str) WHERE LOWER(name) = #{name}(无需修改)
字符串长度 LENGTH(str) LENGTH(str) 或 CHAR_LENGT SELECT LENGTH(name) AS nameLen(无需修改)
截取字符串(从索引n取m个) SUBSTRING(str, n, m)(索引从1开始) SUBSTRING(str, n, m)(完全兼容) SUBSTRING(phone, 1, 3) AS phonePrefix(无需修改)
首尾去空格 TRIM(str) TRIM(str)(完全兼容) WHERE TRIM(name) = #{name}(无需修改)
字符串替换 REPLACE(str, old, new) REPLACE(str, old, new)(完全兼容) REPLACE(content, ' ', '') AS noSpaceContent(无需修改)
日期转字符串(格式化) DATE_FORMAT(date, '%Y-%m-%d') TO_CHAR(date, 'YYYY-MM-DD') MySQL:DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:%s') 瀚高:TO_CHAR(create_time, 'YYYY-MM-DD HH24:MI:SS')

(二)日期/时间相关转换(高频踩坑)

日期时间处理的核心差异的是「格式化符」和「时间戳转换」,MySQL的%H、%i等格式符在瀚高不生效,需替换为对应格式,具体如下:

功能描述 MySQL 函数/语法 瀚高(PostgreSQL)函数/语法 XML示例对比(直接复用)
时间戳转日期时间 FROM_UNIXTIME(timestamp) TO_TIMESTAMP(timestamp) MySQL:FROM_UNIXTIME(#{ts}) AS createTime 瀚高:TO_TIMESTAMP(#{ts}) AS createTime
日期时间转时间戳(秒) UNIX_TIMESTAMP(date) EXTRACT(EPOCH FROM date) MySQL:UNIX_TIMESTAMP(create_time) AS ts 瀚高:EXTRACT(EPOCH FROM create_time) AS ts
字符串转日期时间 STR_TO_DATE(str, '%Y-%m-%d') TO_DATE(str, 'YYYY-MM-DD') MySQL:STR_TO_DATE(#{dateStr}, '%Y-%m-%d') 瀚高:TO_DATE(#{dateStr}, 'YYYY-MM-DD')
日期转年月(如2026-01) DATE_FORMAT(date, '%Y-%m') TO_CHAR(date, 'YYYY-MM') MySQL:DATE_FORMAT(create_time, '%Y-%m') AS yearMonth瀚高:TO_CHAR(create_time, 'YYYY-MM') AS yearMonth
当前日期/时间 NOW() / CURRENT_TIMESTAMP() / CURRENT_DATE() NOW() / CURRENT_TIMESTAMP() / CURRENT_DATE()(完全兼容) INSERT INTO t_log(create_time) VALUES(NOW())(无需修改)
日期加减(加n天) DATE_ADD(date, INTERVAL 1 DAY) date + INTERVAL '1 day' MySQL:DATE_ADD(create_time, INTERVAL #{n} DAY) 瀚高:create_time + INTERVAL '#{n}' day
日期加减(加n小时) DATE_ADD(date, INTERVAL 2 HOUR) date + INTERVAL '2 hour' MySQL:DATE_ADD(create_time, INTERVAL #{n} HOUR)瀚高:create_time + INTERVAL '#{n}' hour

💡 日期格式化符差异汇总(必记):

MySQL:%Y(年)、%m(月)、%d(日)、%H(24小时)、%i(分钟)、%s(秒)

瀚高:YYYY(年)、MM(月)、DD(日)、HH24(24小时)、MI(分钟)、SS(秒)

(三)数值相关转换(兼容度高)

数值转换函数多数兼容,仅字符串与数值互转需微调,核心是瀚高推荐使用TEXT类型存储字符串,而非CHAR。

功能描述 MySQL 函数/语法 瀚高(PostgreSQL)函数/语法 XML示例对比(直接复用)
字符串转整数 CAST(str AS UNSIGNED) / INT(str) CAST(str AS INTEGER) 或 TO_NUMBER(str) MySQL:CAST(#{strId} AS UNSIGNED) AS id 瀚高:CAST(#{strId} AS INTEGER) AS id
字符串转小数 CAST(str AS DECIMAL(10,2)) CAST(str AS DECIMAL(10,2))(完全兼容) CAST(#{amountStr} AS DECIMAL(10,2)) AS amount(无需修改)
整数转字符串 CAST(num AS CHAR) / CONVERT(num, CHAR) CAST(num AS TEXT) 或 TO_CHAR(num) MySQL:CAST(id AS CHAR) AS idStr 瀚高:CAST(id AS TEXT) AS idStr
四舍五入(保留n位小数) ROUND(num, n) ROUND(num, n)(完全兼容) ROUND(amount, 2) AS roundAmount(无需修改)
空值替换(数值) IFNULL(num, 0) COALESCE(num, 0)(推荐) MySQL:IFNULL(score, 0) AS score 瀚高:COALESCE(score, 0) AS score

(四)布尔/空值相关转换

MySQL无原生布尔类型,常用0/1表示,而瀚高有原生BOOLEAN类型,转换时需注意类型适配;空值处理推荐统一使用COALESCE,通用性更强。

功能描述 MySQL 函数/语法 瀚高(PostgreSQL)函数/语法 XML示例对比(直接复用)
通用空值替换 IFNULL(a, b) COALESCE(a, b)(兼容IFNULL,推荐) MySQL:IFNULL(name, '未知') AS name 瀚高:COALESCE(name, '未知') AS name
MySQL特有空值替换 ISNULL(a, b) COALESCE(a, b) MySQL:ISNULL(phone, '无') AS phone瀚高:COALESCE(phone, '无') AS phone
字段判空 a IS NULL / a IS NOT NULL a IS NULL / a IS NOT NULL(完全兼容) WHERE name IS NOT NULL(无需修改)
布尔值转整数(1/0) IF(condition, 1, 0) CASE WHEN condition THEN 1 ELSE 0 END MySQL:IF(status=1, 1, 0) AS isEnable 瀚高:CASE WHEN status=1 THEN 1 ELSE 0 END AS isEnable
整数转布尔值(0/1→false/true) 隐式转换 CAST(num AS BOOLEAN) MySQL:WHERE is_valid=1 瀚高:WHERE CAST(is_valid AS BOOLEAN)

三、核心使用技巧(避坑+高效)

  1. 优先复用兼容函数

LOWER、UPPER、TRIM、REPLACE、ROUND、NOW()等函数完全兼容MySQL,无需修改,直接复用即可,减少工作量。

  1. 字符串拼接推荐用「||」

瀚高数据库中,a || b || c 的拼接性能优于CONCAT(a,b,c),且语法更简洁,尤其适合模糊查询(如'%' || #{name} || '%')。

  1. 空值处理统一用COALESCE

COALESCE支持多参数(如COALESCE(a, b, c)),取第一个非空值,通用性强于MySQL的IFNULL(仅支持两个参数),统一使用可减少后续维护成本。

  1. 批量替换技巧

在IDEA、VS Code等工具中,可使用「全局替换」功能批量处理高频差异:

  • 替换DATE_FORMAT为TO_CHAR,同时替换格式符(%H→HH24、%i→MI、%s→SS);

  • 替换GROUP_CONCAT为STRING_AGG;

  • 替换IFNULL为COALESCE。

四、实战示例(完整XML对比)

以下是MySQL XML与修改后瀚高XML的完整对比,直观展示函数替换效果,可直接参考:

bash 复制代码
<mapper namespace="com.example.mapper.UserMapper">
    <!-- 分页查询,包含字符串、日期、空值处理 -->
    <select id="queryUserList" resultType="User">
        SELECT 
            id, 
            name, 
            DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:%s') AS createTime,
            IFNULL(age, 0) AS age,
            GROUP_CONCAT(role SEPARATOR ',') AS roles
        FROM `user`
        <where>
            <if test="name != null">AND name LIKE CONCAT('%', #{name}, '%')</if>
            <if test="createTime != null">AND create_time >= FROM_UNIXTIME(#{createTime})</if>
        </where>
        ORDER BY create_time DESC
        LIMIT #{offset}, #{size}
    </select>
</mapper>

修改后瀚高XML

bash 复制代码
<mapper namespace="com.example.mapper.UserMapper">
    <!-- 分页查询,函数替换完成,框架标签不变 -->
    <select id="queryUserList" resultType="User">
        SELECT 
            id, 
            name, 
            TO_CHAR(create_time, 'YYYY-MM-DD HH24:MI:SS') AS createTime,
            COALESCE(age, 0) AS age,
            STRING_AGG(role, ',') AS roles
        FROM "user"  <!-- 反引号替换为双引号,适配瀚高大小写 -->
        <where>
            <if test="name != null">AND name LIKE '%' || #{name} || '%'</if>
            <if test="createTime != null">AND create_time >= TO_TIMESTAMP(#{createTime})</if>
        </where>
        ORDER BY create_time DESC
        LIMIT #{size} OFFSET #{offset}  <!-- 分页语法同步修改 -->
    </select>
</mapper>

五、总结

MySQL转瀚高数据库的XML SQL转换,核心是「函数语法替换」,框架标签无需调整。本文整理的转换函数对照表,覆盖了开发中90%以上的高频场景,示例可直接复用,配合全局替换技巧,可快速完成转换。

重点记住3个高频踩坑点:日期格式化符、字符串拼接、空值处理,避开这些就能大幅提升转换效率,减少测试bug。

如果需要某类特定场景的转换函数(如JSON转换、数组转换),或有XML转换中的具体问题,欢迎在评论区留言交流~

相关推荐
筷乐老六喝旺仔2 小时前
使用PyQt5创建现代化的桌面应用程序
jvm·数据库·python
想做一只开心的菜鸡2 小时前
DARTS#02 | 从共识算法到存算分离:深度拆解云原生数据库的稳定性基石
数据库
咚咚?2 小时前
麒麟操作系统达梦数据库集群安装(一主一从)
数据库
Mr_Xuhhh2 小时前
MySQL复合查询详解:多表查询、子查询与合并查询
数据库·sql·mysql
Warren982 小时前
Pytest Fixture 到底该用 return 还是 yield?
数据库·oracle·面试·职场和发展·单元测试·pytest·pyqt
武超杰2 小时前
深入理解JDBC:Java数据库连接的核心技术与实践
java·开发语言·数据库·jdbc
JSON_L2 小时前
使用 SQLite 创建数据库和表
数据库·sqlite·php
m0_706653232 小时前
自然语言处理(NLP)入门:使用NLTK和Spacy
jvm·数据库·python
Big Cole2 小时前
PHP 面试:MySQL 核心问题之索引与优化
mysql·面试·php