Типы PostgreSQL bytea
и bit varying
звучат одинаково:
-
bytea
хранит двоичные строки. -
bit varying
хранит строки 1 и 0.
В документации не указывается максимальный размер. Это 1GB, как character varying
?
У меня есть два отдельных варианта использования, как по таблице с миллионами строк:
Хранение хешей MD5
Это будет bytea
длиной 16 байт или bit(128)
. Он будет использоваться для:
- Дедупликация: интенсивное использование
GROUP BY
, с индексом, который я предполагаю. - Запрос с помощью
WHERE md5 =
только для точных совпадений. - Отображение в виде шестнадцатеричной строки для использования человеком.
Сохранение произвольных двоичных данных
Строки двоичных данных различной длины до 4 КБ для:
- Побитовые операции для поиска строк, соответствующих определенной маске. Пример в конце этого сообщения.
- Извлечение некоторых байтов, например, получение целочисленного значения байта 14 в моей строке.
- Некоторая дедупликация.
Рабочий пример для побитовой операции, используя bit varying
. Маска X'00FF00 ', и она возвращает только строку X'AAAAAA'. Я сократил строки для примера, но это было бы на всю длину, до 4 КБ. Можно ли сделать что-то подобное с 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?