You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写Liquibase脚本在PostgreSQL中哈希列?解决HASH参数错误

解决PostgreSQL中Liquibase脚本哈希owner_name列的报错问题

问题原因

你遇到的报错是因为PostgreSQL内置的hash()函数要求传入2-3个参数(待哈希值、整数种子,可选哈希版本),而你只传了owner_name一个参数。另外需要注意:内置hash()是PostgreSQL内部哈希表使用的函数,返回integer类型,碰撞概率高,不适合持久化存储用户数据的哈希值,更推荐使用pgcrypto扩展的标准哈希函数。

正确的Liquibase脚本

以下是基于pgcrypto扩展实现SHA-256哈希的完整脚本:

  1. 启用pgcrypto扩展(如果未启用)
<changeSet id="enable-pgcrypto-extension" author="your-author-name">
    <sql>CREATE EXTENSION IF NOT EXISTS pgcrypto;</sql>
</changeSet>
  1. 添加owner_name_hash列
    选择text类型存储十六进制格式的哈希值(也可以用bytea存储原始二进制哈希):
<changeSet id="add-owner-name-hash-column" author="your-author-name">
    <addColumn tableName="iou_states">
        <column name="owner_name_hash" type="text" nullable="true"/>
    </addColumn>
</changeSet>
  1. 批量生成并赋值哈希值
    使用digest()生成SHA-256哈希,再通过encode()转成十六进制文本:
<changeSet id="populate-owner-name-hash" author="your-author-name">
    <update tableName="iou_states">
        <column name="owner_name_hash" valueComputed="encode(digest(owner_name::text, 'sha256'), 'hex')"/>
    </update>
</changeSet>

(可选)使用内置hash函数的写法(不推荐)

如果一定要用PostgreSQL内置的hash()函数,需要传入种子参数(比如0),但仅适合内部临时场景:

<changeSet id="populate-owner-name-hash-internal" author="your-author-name">
    <update tableName="iou_states">
        <column name="owner_name_hash" valueComputed="hash(owner_name::text, 0)"/>
    </update>
</changeSet>

关键说明

  • digest()函数第一个参数是待哈希的文本(需确保owner_name转成text类型),第二个参数是哈希算法(支持sha256、sha512、md5等)。
  • encode(..., 'hex')将二进制哈希值转为可读的十六进制字符串,方便存储和查询。

内容的提问来源于stack exchange,提问作者Manikanta Reddy A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 07:15:38