最近在使用KingFusion开发MES系统,其中有些通用的功能可以参考以往的项目代码。
在开发调试用户密码重置功能时,遇到一个报错。
于是将报错的SQL语句丢给豆老师,帮忙解析。
01 问题
帮忙解析一下下面的SQL语句,看是否存在错误:
sql
UPDATE "AA_Basic_User_Role"
SET "c_Password"=CONVERT(VARCHAR(32), HASHBYTES('MD5', 'Admin@123'), 2)
WHERE "c_StaffID"='P000002' AND "c_StaffName"='雷布斯'
于是豆老师给出了:
主句解析+错误排查+可直接运行的修正版
但由于给出的答案不够精准,于是补充提问:
补充:上面的语句是PG库的SQL语句
很快,豆老师给出了更加精准的回复:
02 先告诉你结论
你这条 SQL 在 PG 里完全不能运行,全是错误!
因为你写的是 SQL Server 语法,PG 不支持。
03 逐句解析错误(PG 环境下)
sql
sql
UPDATE "AA_Basic_User_Job"
SET "c_Password"=CONVERT(VARCHAR(32), HASHBYTES('MD5', 'Admin@123'), 2)
WHERE "c_StaffID"='P000002' AND "c_StaffName"='雷布斯'
❶ CONVERT () 函数 → PG 没有这个函数
PG 不支持 CONVERT,这是 SQL Server 专属。
❷ HASHBYTES () 函数 → PG 也没有
HASHBYTES 是 SQL Server 用来做 MD5 的,PG 用 md5()。
❸ VARCHAR (32) 这种写法 PG 不报错,但没必要
❹ 双引号没问题(PG 支持双引号包裹表 / 字段名)

04 PG 中 正确的 MD5 更新语句
直接复制这条就能运行:
sql
sql
UPDATE "AA_Basic_User_Role"
SET "c_Password" = md5('Admin@123')
WHERE "c_StaffID" = 'P000002' AND "c_StaffName" = '雷布斯';
效果完全一样:
把密码变成 32 位小写 MD5 字符串。
05 简单对比你就懂了
| 数据库 | MD5 写法 |
|---|---|
| SQL Server | HASHBYTES ('MD5', ' 明文 ') |
| MySQL | MD5 (' 明文 ') |
| PostgreSQL | md5 (' 明文 ') |
你之前的写法是 SQL Server 专用,放到 PG 里肯定报错。
06 最终正确语句(PG 100% 可用)
sql
sql
UPDATE "AA_Basic_User_Role"
SET "c_Password" = md5('Admin@123')
WHERE "c_StaffID" = 'P000002';
(c_StaffID 一般唯一,c_StaffName 可删)
07 总结
①原语句错误:
用了 SQL Server 专属函数 CONVERT、HASHBYTES
②PG 正确 MD5 函数:md5('明文')
③直接用我给的最终语句即可执行成功
你在工作过程中有哪些使用AI的场景?效果如何?
欢迎在评论区留言讨论。