PostgreSQL类型bytea
和bit varying
听起来很相似:bytea
存储binary strings。bit varying
存储strings of 1's and 0's。
文档没有提到最大的大小。它是1GB像character varying
吗?
我有两个独立的用例,都在一个有数百万行的表上:
存储MD5哈希
长度为16字节的bytea
或bit(128)
。它将用于:
重复数据消除:大量使用GROUP BY
,我想有一个索引。
仅使用WHERE md5 =
查询精确匹配项。
显示为供人类使用的十六进制字符串。
存储任意二进制数据
长度不超过4kB的二进制数据字符串,用于:
按位操作以查找与某个掩码匹配的字符串。这篇文章最后的例子。
提取一些字节,例如获取字符串中字节14的整数值。
一些重复数据消除。
位操作的工作示例,使用bit varying
。掩码是X'00FF00',它只返回行X'AAAAAA'。我缩短了这个例子中的字符串,但它会超过它们的全长,高达4kB。是否可以使用bytea
执行类似的操作?
CREATE TABLE test1 (mystring bit varying);
INSERT INTO test1 VALUES (X'AAAAAA'), (X'ABCABC');
SELECT * FROM test1 WHERE mystring & X'00FF00' = X'00AA00';
bytea
和bit varying
哪个更合适?我看到
UUID
类型被设置为正好存储16个字节,这对存储MD5有什么好处吗? 最佳答案
一般来说,如果不使用按位操作,则应使用bytea
。
我将较大的值存储在bytea
中,然后尽可能将子字符串转换为bit varying
进行逐位操作,这主要是因为客户机对bytea
的理解比bit varying
一致得多,而且I/O格式更紧凑。
MD5值应存储为bytea
。对它们执行按位操作毫无意义,通常需要将它们作为二进制文件获取。
我认为bit varying
确实有两个用途:
存储字面上是位字符串的标志字段;以及
作为内部计算的中间数据类型
对于几乎所有其他内容,请使用bytea
。
不过,没有什么能阻止你存储4k位字段。
关于postgresql - PostgreSQL:“字节”和“位变化”类型之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26635547/