如果您不太可能在单个字段中存储超过 1GB 的二进制数据,则不妨使用普通的 bytea 类型而不是 LOB 它。
它们不会使表膨胀,因为 PostgreSQL 会将较大的字节流存储在表外部(就像大型对象存储一样,只是透明地) - 包括在有助于的情况下压缩它们 - 同时保留所有二进制字符串函数和运算符。
(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL pdo_pgsql >= 1.0.2)
PDO::pgsqlLOBCreate — Pdo\Pgsql::lobCreate() 的别名
如果您不太可能在单个字段中存储超过 1GB 的二进制数据,则不妨使用普通的 bytea 类型而不是 LOB 它。
它们不会使表膨胀,因为 PostgreSQL 会将较大的字节流存储在表外部(就像大型对象存储一样,只是透明地) - 包括在有助于的情况下压缩它们 - 同时保留所有二进制字符串函数和运算符。
恕我直言,处理 lob 对象删除的更好方法是此处建议的方法。程序员很容易忘记取消链接 lob。使用以下触发器,不需要程序员的操作。
顺便说一句,bytea 字段的一个问题是,当您查询数据库时,如果您请求该字段,则实际上会检索数据。当您查询 oid 时,仅检索 oid,然后您可以在任何时候打开 lob(如果需要)。
CREATE OR REPLACE FUNCTION oidtable_after_update_delete()
RETURNS "trigger" AS
$BODY$
BEGIN
IF (TG_OP = 'UPDATE') THEN
IF (OLD.oidfield = NEW.oidfield) OR (OLD.oidfield IS NULL) THEN
RETURN NEW;
END IF;
END IF;
IF (EXISTS (SELECT 1 FROM pg_largeobject WHERE loid = OLD.oidfield)) THEN
PERFORM LO_UNLINK (OLD.oidfield);
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
CREATE TRIGGER oidtable_after_update_delete
AFTER UPDATE OR DELETE
ON oidtable
FOR EACH ROW
EXECUTE PROCEDURE oidtable_after_update_delete();