type</secondary>
</indexterm>
<para>
Bit strings are strings of 1's and 0's. They can be used to store
or visualize bit masks. There are two SQL bit types:
<type>bit(<replaceable>n</replaceable>)</type> and <type>bit
varying(<replaceable>n</replaceable>)</type>, where
<replaceable>n</replaceable> is a positive integer.
</para>
<para>
<type>bit</type> type data must match the length
<replaceable>n</replaceable> exactly; it is an error to attempt to
store shorter or longer bit strings. <type>bit varying</type> data is
of variable length up to the maximum length
<replaceable>n</replaceable>; longer strings will be rejected.
Writing <type>bit</type> without a length is equivalent to
<literal>bit(1)</literal>, while <type>bit varying</type> without a length
specification means unlimited length.
</para>
<note>
<para>
If one explicitly casts a bit-string value to
<type>bit(<replaceable>n</replaceable>)</type>, it will be truncated or
zero-padded on the right to be exactly <replaceable>n</replaceable> bits,
without raising an error. Similarly,
if one explicitly casts a bit-string value to
<type>bit varying(<replaceable>n</replaceable>)</type>, it will be truncated
on the right if it is more than <replaceable>n</replaceable> bits.
</para>
</note>
<para>
Refer to <xref
linkend="sql-syntax-bit-strings"/> for information about the syntax
of bit string constants. Bit-logical operators and string
manipulation functions are available; see <xref
linkend="functions-bitstring"/>.
</para>
<example>
<title>Using the Bit String Types</title>
<programlisting>
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');
<computeroutput>
ERROR: bit string length 2 does not match type bit(3)
</computeroutput>
INSERT INTO test VALUES (B'10'::bit(3), B'101');
SELECT * FROM test;
<computeroutput>
a | b
-----+-----
101 | 00
100 | 101
</computeroutput>
</programlisting>
</example>
<para>
A bit string value requires 1 byte for each group of 8 bits, plus
5 or 8 bytes overhead depending on the length of the string
(but long values may be compressed or moved out-of-line, as explained
in <xref linkend="datatype-character"/> for character strings).
</para>
</sect1>
<sect1 id="datatype-textsearch">
<title>Text Search Types</title>
<indexterm zone="datatype-textsearch">
<primary>full text search</primary>
<secondary>data types</secondary>
</indexterm>
<indexterm zone="datatype-textsearch">
<primary>text search</primary>
<secondary>data types</secondary>
</indexterm>
<para>
<productname>PostgreSQL</productname> provides two data types that
are designed to support full text search, which is the activity of
searching through a collection of natural-language <firstterm>documents</firstterm>
to locate those that best match a <firstterm>query</firstterm>.
The <type>tsvector</type> type represents a document in a form optimized
for text search; the <type>tsquery</type> type similarly represents
a text query.
<xref linkend="textsearch"/> provides a detailed explanation of this
facility, and <xref linkend="functions-textsearch"/> summarizes the
related functions and operators.
</para>
<sect2 id="datatype-tsvector">
<title><type>tsvector</type></title>
<indexterm>
<primary>tsvector (data type)</primary>
</indexterm>
<para>
A <type>tsvector</type> value is a sorted list of distinct
<firstterm>lexemes</firstterm>, which are words that have been
<firstterm>normalized</firstterm> to merge different variants of the same word
(see <xref linkend="textsearch"/> for details). Sorting and
duplicate-elimination are done automatically during input, as shown in
this example:
<programlisting>