前言:
在MySQL转瀚高数据库的实际开发中,多数开发者会卡在XML SQL(MyBatis mapper.xml、Spring XML配置SQL)的语法适配环节。瀚高数据库基于PostgreSQL内核开发,XML框架标签(、等)无需修改,核心差异集中在MySQL与PostgreSQL的函数语法上。本文整理了高频场景下的转换函数对照表,附XML示例,复制即可替换使用,帮大家避开踩坑点、提升转换效率。
一、前置说明(必看)
-
适配前提:瀚高数据库需替换MySQL JDBC驱动为瀚高驱动(com.highgo:highgo-jdbc),URL格式改为jdbc:highgo://ip:port/dbname?user=xxx&password=xxx,与PostgreSQL兼容。
-
核心原则:XML中的框架标签(MyBatis/Spring)用法完全不变,仅需替换SQL语句中的函数;优先使用兼容函数,减少修改成本。
-
避坑重点:日期格式化符、字符串拼接、空值处理是高频踩坑点,下文会重点标注差异,务必注意区分。
-
相关依赖
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>
- 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) |
三、核心使用技巧(避坑+高效)
- 优先复用兼容函数
LOWER、UPPER、TRIM、REPLACE、ROUND、NOW()等函数完全兼容MySQL,无需修改,直接复用即可,减少工作量。
- 字符串拼接推荐用「||」
瀚高数据库中,a || b || c 的拼接性能优于CONCAT(a,b,c),且语法更简洁,尤其适合模糊查询(如'%' || #{name} || '%')。
- 空值处理统一用COALESCE
COALESCE支持多参数(如COALESCE(a, b, c)),取第一个非空值,通用性强于MySQL的IFNULL(仅支持两个参数),统一使用可减少后续维护成本。
- 批量替换技巧
在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转换中的具体问题,欢迎在评论区留言交流~