位串即一串 1 和 0 的串。它们可以用于存储和可视化位掩码。我们有两种类型的 SQL 位类
型:bit(n)和bit varying(n),其中n是一个正整数。
bit类型的数据必须准确匹配长度n; 试图存储短些或者长一些的位串都是错误的。bit varying(也可以写成varbit)数据是最长n的变长类型,更长的串会被拒绝。写一个没有长度的bit等效于 bit(1),没有长度的bit varying意味着没有长度限制。
例子:
–建表
bill=# create table t_test (
bill(# dt date,
bill(# amount int,
bill(# users varbit
bill(# );
CREATE TABLE
–自定义一个随机bit函数
bill=# create or replace function gen_rand_bit() returns bit(64) as $$
bill$# select (sqrt(random())::numeric*9223372036854775807*2-9223372036854775807::numeric)::int8::bit(64);
bill$# $$ language sql strict;
CREATE FUNCTION
–插入测试数据
bill=# insert into t_test
bill-# select current_date-(random()*1000)::int, random()*100, gen_rand_bit() from generate_series(1,100000);
INSERT 0 100000
–查询
bill=# select * from t_test limit 5;
dt | amount | users
------------+--------+------------------------------------------------------------------
2019-07-31 | 0 | 0010001011001110011101101011001111000111100000111010111110111010
2019-12-16 | 98 | 0101100000101010001001000001010100010001001100111101011000010010
2018-07-16 | 47 | 1111000111001101001100011101010100010110111001001111110010011000
2018-03-23 | 17 | 0011011111000101111111000001101010000001011110101110000010111110
2017-08-14 | 17 | 0011001111101110110001011001110111101100100110001010111101000011
(5 rows)
我们还可以将整数和bit类型相互转换:
bill=# select 55::bit(10);
bit
------------
0000110111
(1 row)
bill=# select '1110'::bit(4)::integer;
int4
------
14
(1 row)
常见操作符:
连接 ||
bill=# select B'10001' || B'011';
?column?
----------
10001011
(1 row)
按位与 &
bill=# select B'10001' & B'01101';
?column?
----------
00001
(1 row)
按位或 |
bill=# select B'10001' | B'01101';
?column?
----------
11101
(1 row)
按位异或 #
bill=# select B'10001' # B'01101';
?column?
----------
11100
(1 row)
按位求反 ~
bill=# select ~ B'10001';
?column?
----------
01110
(1 row)
按位左移 <<
bill=# select B'10001' << 3;
?column?
----------
01000
(1 row)
按位右移 >>
bill=# select B'10001' >> 2;
?column?
----------
00100
(1 row)