PostgreSQL bit类型使用

位串即一串 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)
发布了70 篇原创文章 · 获赞 5 · 访问量 3117

猜你喜欢

转载自blog.csdn.net/weixin_39540651/article/details/103958376