8.10. Битовые строки

Битовые строки представляют собой последовательности из 1 и 0. Их можно использовать для хранения или отображения битовых масок. В SQL есть два битовых типа: bit(n) и bit varying(n), где n — положительное целое число.

Длина значения типа bit должна в точности равняться n; при попытке сохранить данные длиннее или короче произойдёт ошибка. Данные типа bit varying могут иметь переменную длину, но не превышающую n; строки большей длины не будут приняты. Запись bit без указания длины равнозначна записи bit(1), тогда как bit varying без указания длины подразумевает строку неограниченной длины.

Примечание

При попытке привести значение битовой строки к типу bit(n), оно будет усечено или дополнено нулями справа до длины ровно n бит, ошибки при этом не будет. Подобным образом, если явно привести значение битовой строки к типу bit varying(n), она будет усечена справа, если её длина превышает n бит.

Синтаксис констант битовых строк описан в Подразделе 4.1.2.5, а все доступные битовые операторы и функции перечислены в Разделе 9.6.

Пример 8.3. Использование битовых строк

CREATE TABLE test (a BIT(3), b BIT VARYING(5));
INSERT INTO test VALUES (B'101', B'00');
INSERT INTO test VALUES (B'10', B'101');

ОШИБКА:  длина битовой строки (2) не соответствует типу bit(3)

INSERT INTO test VALUES (B'10'::bit(3), B'101');
SELECT * FROM test;

  a  |  b
-----+-----
 101 | 00
 100 | 101

Для хранения битовой строки используется по 1 байту для каждой группы из 8 бит, плюс 5 или 8 байт дополнительно в зависимости от длины строки (но длинные строки могут быть сжаты или вынесены отдельно, как описано в Разделе 8.3 применительно к символьным строкам).

63.2. Built-in Operator Classes

The core PostgreSQL distribution includes the GIN operator classes shown in Table 63.1. (Some of the optional modules described in Appendix F provide additional GIN operator classes.)

Table 63.1. Built-in GIN Operator Classes

NameIndexed Data TypeIndexable Operators
_abstime_opsabstime[]&& <@ = @>
_bit_opsbit[]&& <@ = @>
_bool_opsboolean[]&& <@ = @>
_bpchar_opscharacter[]&& <@ = @>
_bytea_opsbytea[]&& <@ = @>
_char_ops"char"[]&& <@ = @>
_cidr_opscidr[]&& <@ = @>
_date_opsdate[]&& <@ = @>
_float4_opsfloat4[]&& <@ = @>
_float8_opsfloat8[]&& <@ = @>
_inet_opsinet[]&& <@ = @>
_int2_opssmallint[]&& <@ = @>
_int4_opsinteger[]&& <@ = @>
_int8_opsbigint[]&& <@ = @>
_interval_opsinterval[]&& <@ = @>
_macaddr_opsmacaddr[]&& <@ = @>
_money_opsmoney[]&& <@ = @>
_name_opsname[]&& <@ = @>
_numeric_opsnumeric[]&& <@ = @>
_oid_opsoid[]&& <@ = @>
_oidvector_opsoidvector[]&& <@ = @>
_reltime_opsreltime[]&& <@ = @>
_text_opstext[]&& <@ = @>
_time_opstime[]&& <@ = @>
_timestamp_opstimestamp[]&& <@ = @>
_timestamptz_opstimestamp with time zone[]&& <@ = @>
_timetz_opstime with time zone[]&& <@ = @>
_tinterval_opstinterval[]&& <@ = @>
_varbit_opsbit varying[]&& <@ = @>
_varchar_opscharacter varying[]&& <@ = @>
jsonb_opsjsonb? ?& ?| @>
jsonb_path_opsjsonb@>
tsvector_opstsvector@@ @@@

Of the two operator classes for type jsonb, jsonb_ops is the default. jsonb_path_ops supports fewer operators but offers better performance for those operators. See Section 8.14.4 for details.