
# 位串类型
位串就是一串由1和0组成的字符串。它们可以用于存储位掩码。M-Compatibility支持的位串类型如[表1]所示。
 表1位串类型 
| 名称         | 描述                                                                  | 存储空间    |
|:---|:---|:---|
| BIT\[(n)\] | 位串就是一串由1和0组成的字符串。它们可以用于存储位掩码。 n是指位串长度, 取值范围为\[1,64\]，如不带精度n，默认精度为1。 | 最大为64字节 |
   
![](https://support.huaweicloud.com/distributed-m-comp-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 如果用户明确地把一个位串值转换成BIT(n)，则此位串右边的内容将被截断或者在右边补齐零，直到刚好n位，而不会返回出任何错误。
- 如果用户输出位串值，将会把原有数据的位串值以字符串形式输出，具体如[示例]所示。
- BIT类型支持位串输入和普通字符串输入，具体如[示例]所示。
- sql_mode参数值包含"strict_trans_tables"时，非法输入或者超过范围会报错，不包含时非法输入或者超过范围存入当前长度的最大值。
- JDBC\&\&PBE场景下通过setBytes或setBinaryStream向BIT列插入数据时，如果字节流不是4字节对齐的。M-Compatibility中会因为数据不完整，无法成功插入并提示报错。使用setString方法替代setBytes方法。
 
 #### 示例
显示用字符串输出位串类型。
```
--创建表。
m_db=# CREATE TABLE bit_type_t1
(
    BIT_COL BIT(64)
) DISTRIBUTE BY REPLICATION;
-- 插入数据。集中式成功，分布式报错了
m_db=# INSERT INTO bit_type_t1 VALUES (b'101');
-- 查询表中数据。
m_db=# SELECT *  FROM bit_type_t1;
 bit_col 
---------
 101
(1 row)
--删除表。
m_db=# DROP TABLE bit_type_t1;
--创建表。
m_db=# CREATE TABLE bit_type_t2
(
    BIT_COL BIT(3)
) DISTRIBUTE BY REPLICATION;
--严格模式下插入的数据长度超过类型规定的长度报错。
m_db=# SET SQL_MODE = 'strict_trans_tables,only_full_group_by,no_zero_in_date,no_zero_date,error_for_division_by_zero,
no_auto_create_user,no_engine_substitution';
SET
m_db=# INSERT INTO bit_type_t2 VALUES (b'10101');
ERROR:  bit string too long for type bit varying(3)
CONTEXT:  referenced column: bit_col
--宽松模式下插入的数据长度超过类型规定的长度,数据取长度内最大值插入。
m_db=# SET SQL_MODE = '';
SET
m_db=# INSERT INTO bit_type_t2 VALUES (b'10101');
INSERT 0 1
--查询表中的数据。
m_db=# SELECT * FROM bit_type_t2;
 bit_col 
---------
 111
(1 row)
--删除表。
m_db=# DROP TABLE bit_type_t2;
```
