位串类型是可以存放一系列二进制位的类型,相对于二进制类型来说,此类型在做一些位操作更方便、更直观,本节将详细讲解它们的使用方法。
位串就是一串由1和0组成的字符串。PostgreSQL中可以直观地显式操作二进制位。下面是两种SQL位类型:
·bit(n)。
·bit varying(n)。
其中n是一个正整数。
bit(n)类型的数据必须准确匹配长度n,试图存储短一些或者长一些的数据都是错误的。
bit varying(n)类型的数据是最长为n的变长类型,更长的串会被拒绝。写一个没有长度的bit等效于bit(1),没有长度的bit varying表示没有长度限制。
如果明确地把一个位串值转换成bit(n),那么它的右边将被截断,或者在右边补齐0到刚好为n位,而不会抛出任何错误。类似地,如果明确地把一个位串数值转换成bit varying(n),而其超过n位,那么它的右边将被截断。
下面介绍位串类型的使用方法,首先创建一个测试表,示例如下:
CREATE TABLE test (a BIT(3), b BIT VARYING(5));
插入一条测试数据:
osdba=# INSERT INTO test VALUES (B'101', B'00'); INSERT 0 1
对于bit(n)字段,如果插入的数据的长度小于定义的长度n或超过了定义的长度n都将报错:
osdba=# INSERT INTO test VALUES (B'10', B'101'); ERROR: bit string length 2 does not match type bit(3) osdba=# INSERT INTO test VALUES (B'11110', B'101'); ERROR: bit string length 5 does not match type bit(3)
对于bit varying(n),如果插入的数据超过了匹配的长度n也会报错:
osdba=# INSERT INTO test VALUES (B'110', B'111101'); ERROR: bit string too long for type bit varying(5)
位串除了常用的比较操作符之外,主要支持一些位运算的操作符,具体见表5-13。
表5-13 位串类型的操作符
下列SQL标准函数既可以用于字符串,也可以用于位串:
·length。
·bit_length。
·octet_length。
·position。
·substring。
·overlay。
下列函数既支持二进制字符串,也可用于位串:
·get_bit。
·set_bit。
当用于位串时,上述函数的位数将以串(最左边)的第一位作为0位。
另外,可以在整数和bit之间进行转换。示例如下:
osdba=# select 66::bit(10); bit ------------ 0001000010 (1 row) osdba=# select 66::bit(3); bit ----- 010 (1 row) osdba=# select cast(-66 as bit(12)); bit -------------- 111110111110 (1 row)
下面来看一下PostgreSQL中十进制、十六进制、二进制之间的转换示例。
十进制转二进制的示例如下:
osdba=# select 85::bit(8); bit ---------- 01010101 (1 row)
十六进制转二进制的示例如下:
osdba=# select 'xff'::bit(8); bit ---------- 11111111 (1 row)
十六进制转十进制的示例如下:
osdba=# select 'xff'::bit(8)::int; int4 ------ 255 (1 row)
十进制转十六进制的示例如下:
osdba=# select to_hex(255); to_hex -------- ff (1 row)