mysql关于bit类型用法


本文来源于:http://www.server110.com/mysql/201403/7117.html

Mysql关于bit类型的用法:

官方的资料如下:

9.1.5. 位字段值

可以使用b'value'符号写位字段值。value是一个用0和1写成的二进制值。

位字段符号可以方便指定分配给BIT列的值:

mysql> CREATE TABLE t (b BIT(8));

mysql> INSERT INTO t SET b = b'11111111';

mysql> INSERT INTO t SET b = b'1010';

+------+----------+----------+----------+

| b+0  | BIN(b+0) | OCT(b+0) | HEX(b+0) |

+------+----------+----------+----------+

| 255 | 11111111 | 377      | FF       ||   10 | 1010     | 12       | A        |

+------+----------+----------+----------+

Mysql:bit类型的查询与插入

Posted 10月 11, 2010 by logineran in MYSQL. Tagged: MYSQL.

mysql有种字段类型是bit。

1.如何插入呢?它的插入必须采用:可以使用b’value’符号写位字段值。value是一个用0和1写成的二进制值。mysql> create table an_bit (id bit(8));Query OK, 0 rows affected (0.00 sec)

mysql> insert into an_bit values (11);Query OK, 1 row affected (0.00 sec)虽然可以插入,但是实际插入的数值是11(十进制),不是3(十进制)。

mysql> insert into an_bit values (b’11′);Query OK, 1 row affected (0.00 sec)这才是正确的插入方法。 插入的值是3(十进制)

2. 如何查询呢?mysql> select * from an_bit;+——+| id   |+——+|||     |+——+2 rows in set (0.00 sec)这样是不对的,看不到东西

mysql> select id+0 from an_bit;+——+| id+0 |+——+|   11 ||    3 |+——+2 rows in set (0.00 sec)这是正确的,可以看到十进制的值。

mysql> select bin(id+0) from an_bit;+———–+| bin(id+0) |+———–+| 1011      || 11        |+———–+2 rows in set (0.00 sec)这是二进制的值

mysql> select oct(id+0) from an_bit;+———–+| oct(id+0) |+———–+| 13        || 3         |+———–+2 rows in set (0.00 sec)这是八进制的值

mysql> select hex(id+0) from an_bit;+———–+| hex(id+0) |+———–+| B         || 3         |+———–+2 rows in set (0.00 sec)这是十六进制的值

\n

Mysql关于bit类型的用法:

官方的资料如下:

9.1.5. 位字段值

可以使用b'value'符号写位字段值。value是一个用0和1写成的二进制值。

位字段符号可以方便指定分配给BIT列的值:

mysql> CREATE TABLE t (b BIT(8));

mysql> INSERT INTO t SET b = b'11111111';

mysql> INSERT INTO t SET b = b'1010';

+------+----------+----------+----------+

| b+0  | BIN(b+0) | OCT(b+0) | HEX(b+0) |

+------+----------+----------+----------+

| 255 | 11111111 | 377      | FF       ||   10 | 1010     | 12       | A        |

+------+----------+----------+----------+

Mysql:bit类型的查询与插入

Posted 10月 11, 2010 by logineran in MYSQL. Tagged: MYSQL.

mysql有种字段类型是bit。

1.如何插入呢?它的插入必须采用:可以使用b’value’符号写位字段值。value是一个用0和1写成的二进制值。mysql> create table an_bit (id bit(8));Query OK, 0 rows affected (0.00 sec)

mysql> insert into an_bit values (11);Query OK, 1 row affected (0.00 sec)虽然可以插入,但是实际插入的数值是11(十进制),不是3(十进制)。

mysql> insert into an_bit values (b’11′);Query OK, 1 row affected (0.00 sec)这才是正确的插入方法。 插入的值是3(十进制)

2. 如何查询呢?mysql> select * from an_bit;+——+| id   |+——+|||     |+——+2 rows in set (0.00 sec)这样是不对的,看不到东西

mysql> select id+0 from an_bit;+——+| id+0 |+——+|   11 ||    3 |+——+2 rows in set (0.00 sec)这是正确的,可以看到十进制的值。

mysql> select bin(id+0) from an_bit;+———–+| bin(id+0) |+———–+| 1011      || 11        |+———–+2 rows in set (0.00 sec)这是二进制的值

mysql> select oct(id+0) from an_bit;+———–+| oct(id+0) |+———–+| 13        || 3         |+———–+2 rows in set (0.00 sec)这是八进制的值

mysql> select hex(id+0) from an_bit;+———–+| hex(id+0) |+———–+| B         || 3         |+———–+2 rows in set (0.00 sec)这是十六进制的值

\n\n

该类型实际上是字符串类型

\n

设置bit(8)的列,插入57

\n

select * from ... 显示的是ascii码=57的字符'9';

\n

如果向bit(4)的列中插入57

\n

那么显示的字符为空,数字为'1111'=15

\n

但bit类型不能使用字符进行匹配,应为where  a=57;\n不能是where  a='9';

\n \n

char(0)可以代替bit(1)使用,char(0)能保存两个值 NULL 和 空字符串

\n \n\n

该类型实际上是字符串类型

\n

设置bit(8)的列,插入57

\n

select * from ... 显示的是ascii码=57的字符'9';

\n

如果向bit(4)的列中插入57

\n

那么显示的字符为空,数字为'1111'=15

\n

但bit类型不能使用字符进行匹配,应为where  a=57;\n不能是where  a='9';

\n \n

char(0)可以代替bit(1)使用,char(0)能保存两个值 NULL 和 空字符串

\n \n\n

下载知道APP10分钟有问必答!

\n

建议:可使用微信的“扫一扫”功能扫描下载

\n\n\n

下载知道APP10分钟有问必答!

\n

建议:可使用微信的“扫一扫”功能扫描下载

\n\n \n Could not open virtual machine – vmx is not a valid virtual machine configuration file \n

oZiYunYi: \n我也遇到这样的情况,但是,我只是换了个地址就好了,不知道为什么,但是可以安装了,足够了 \n

\n \n \n Could not open virtual machine – vmx is not a valid virtual machine configuration file \n

oZiYunYi: \n我也遇到这样的情况,但是,我只是换了个地址就好了,不知道为什么,但是可以安装了,足够了 \n

\n \n'; \n tpl+= '

' + data.info.username + '' + data.info.dateline + '

'; \n tpl+= '

' + data.info.quota.username + ':'+ data.info.quota.content + '

'; \n tpl+= '

' + data.info.content + '

回复 |  删除 |  举报\n'; \n tpl+= '

' + data.info.username + '' + data.info.dateline + '

'; \n tpl+= '

' + data.info.quota.username + ':'+ data.info.quota.content + '

'; \n tpl+= '

' + data.info.content + '

回复 |  删除 |  举报\n\n

Mysql关于bit类型的用法:

位字段值

使用b'value'符号写位字段值。value是一个用0和1写成的二进制值。

位字段符号可以方便指定分配给BIT列的值:

mysql> CREATE TABLE test (id BIT(8));

mysql> INSERT INTO test VALUES(2) mysql> INSERT INTO test VALUES(5)

mysql> SELECT * FROM test

id 

      ---------   b'10'  b'101' 

Mysql:bit类型的查询与插入

mysql有种字段类型是bit。

如何查询呢? mysql> select * from test; id       ---------   b'10'    b'101' 

mysql> select id+0 from test;    //这是可以看到十进制的   id+0  --------        2        5 2 rows in set (0.00 sec)

mysql> select bin(id+0) from test;  //这是可以看到二进制的 bin(id+0)  -----------     10         101        2 rows in set (0.00 sec)

mysql> select oct(id+0) from test; // 这是八进制的 oct(id+0)  -----------        2          5          2 rows in set (0.00 sec)

mysql> select hex(id+0) from test; //这是十六进制的 hex(id+0)  -----------         2          5     2 rows in set (0.00 sec)

\n\n\n

Mysql关于bit类型的用法:

位字段值

使用b'value'符号写位字段值。value是一个用0和1写成的二进制值。

位字段符号可以方便指定分配给BIT列的值:

mysql> CREATE TABLE test (id BIT(8));

mysql> INSERT INTO test VALUES(2) mysql> INSERT INTO test VALUES(5)

mysql> SELECT * FROM test

id 

      ---------   b'10'  b'101' 

Mysql:bit类型的查询与插入

mysql有种字段类型是bit。

如何查询呢? mysql> select * from test; id       ---------   b'10'    b'101' 

mysql> select id+0 from test;    //这是可以看到十进制的   id+0  --------        2        5 2 rows in set (0.00 sec)

mysql> select bin(id+0) from test;  //这是可以看到二进制的 bin(id+0)  -----------     10         101        2 rows in set (0.00 sec)

mysql> select oct(id+0) from test; // 这是八进制的 oct(id+0)  -----------        2          5          2 rows in set (0.00 sec)

mysql> select hex(id+0) from test; //这是十六进制的 hex(id+0)  -----------         2          5     2 rows in set (0.00 sec)

\n\n

mysql> desc bb;+-------+---------+------+-----+---------+-------+| Field | Type    | Null | Key | Default | Extra |+-------+---------+------+-----+---------+-------+| id    | int(11) | YES |     | NULL    |       | | btest | bit(10) | YES |     | NULL    |       | +-------+---------+------+-----+---------+-------+2 rows in set (0.00 sec)

mysql> select * from bb;            +------+-------+| id   | btest |+------+-------+|    1 | ?   | |    2 | +    | |    3 |      | |    2 |      | +------+-------+4 rows in set (0.00 sec)

mysql> select id,bin(btest) from bb;         +------+------------+| id   | bin(btest) |+------+------------+|    1 | 11011110   | |    2 | 1000101011 | |    3 | 110        | |    2 | 100        | +------+------------+4 rows in set (0.00 sec)

mysql> select id,bin(btest),hex(btest) from bb;+------+------------+------------+| id   | bin(btest) | hex(btest) |+------+------------+------------+|    1 | 11011110   | DE         | |    2 | 1000101011 | 22B        | |    3 | 110        | 6          | |    2 | 100        | 4          | +------+------------+------------+4 rows in set (0.00 sec)

bit(M)

M为1--64.

\n

mysql> desc bb;+-------+---------+------+-----+---------+-------+| Field | Type    | Null | Key | Default | Extra |+-------+---------+------+-----+---------+-------+| id    | int(11) | YES |     | NULL    |       | | btest | bit(10) | YES |     | NULL    |       | +-------+---------+------+-----+---------+-------+2 rows in set (0.00 sec)

mysql> select * from bb;            +------+-------+| id   | btest |+------+-------+|    1 | ?   | |    2 | +    | |    3 |      | |    2 |      | +------+-------+4 rows in set (0.00 sec)

mysql> select id,bin(btest) from bb;         +------+------------+| id   | bin(btest) |+------+------------+|    1 | 11011110   | |    2 | 1000101011 | |    3 | 110        | |    2 | 100        | +------+------------+4 rows in set (0.00 sec)

mysql> select id,bin(btest),hex(btest) from bb;+------+------------+------------+| id   | bin(btest) | hex(btest) |+------+------------+------------+|    1 | 11011110   | DE         | |    2 | 1000101011 | 22B        | |    3 | 110        | 6          | |    2 | 100        | 4          | +------+------------+------------+4 rows in set (0.00 sec)

bit(M)

M为1--64.

\n

mysql> desc bb;+-------+---------+------+-----+---------+-------+| Field | Type    | Null | Key | Default | Extra |+-------+---------+------+-----+---------+-------+| id    | int(11) | YES |     | NULL    |       | | btest | bit(10) | YES |     | NULL    |       | +-------+---------+------+-----+---------+-------+2 rows in set (0.00 sec)

mysql> select * from bb;            +------+-------+| id   | btest |+------+-------+|    1 | ?   | |    2 | +    | |    3 |      | |    2 |      | +------+-------+4 rows in set (0.00 sec)

mysql> select id,bin(btest) from bb;         +------+------------+| id   | bin(btest) |+------+------------+|    1 | 11011110   | |    2 | 1000101011 | |    3 | 110        | |    2 | 100        | +------+------------+4 rows in set (0.00 sec)

mysql> select id,bin(btest),hex(btest) from bb;+------+------------+------------+| id   | bin(btest) | hex(btest) |+------+------------+------------+|    1 | 11011110   | DE         | |    2 | 1000101011 | 22B        | |    3 | 110        | 6          | |    2 | 100        | 4          | +------+------------+------------+4 rows in set (0.00 sec)

bit(M)

M为1--64.

\n

mysql> desc bb;+-------+---------+------+-----+---------+-------+| Field | Type    | Null | Key | Default | Extra |+-------+---------+------+-----+---------+-------+| id    | int(11) | YES |     | NULL    |       | | btest | bit(10) | YES |     | NULL    |       | +-------+---------+------+-----+---------+-------+2 rows in set (0.00 sec)

mysql> select * from bb;            +------+-------+| id   | btest |+------+-------+|    1 | ?   | |    2 | +    | |    3 |      | |    2 |      | +------+-------+4 rows in set (0.00 sec)

mysql> select id,bin(btest) from bb;         +------+------------+| id   | bin(btest) |+------+------------+|    1 | 11011110   | |    2 | 1000101011 | |    3 | 110        | |    2 | 100        | +------+------------+4 rows in set (0.00 sec)

mysql> select id,bin(btest),hex(btest) from bb;+------+------------+------------+| id   | bin(btest) | hex(btest) |+------+------------+------------+|    1 | 11011110   | DE         | |    2 | 1000101011 | 22B        | |    3 | 110        | 6          | |    2 | 100        | 4          | +------+------------+------------+4 rows in set (0.00 sec)

bit(M)

M为1--64.


<think>嗯,用户想了解MySQL中的bit数据类型的使用和特性。首先,我需要回忆一下MySQL的官方文档和相关资料。记得bit类型是用来存储位字段的,可以指定长度,比如bit(1)就是一个二进制位,通常用来表示布尔值。但用户可能想知道更详细的用法,比如如何插入数据、查询时的处理,以及和其他数据类型的区别。 接下来,我需要参考用户提供的引用内容。引用[2]提到bit(M)可以存储M位的二进制数据,M的范围是1-64。这说明bit类型不仅可以表示布尔值,还能存储更长的二进制数据,比如权限位之类的。另外,引用[2]还提到可以使用位操作来查询或更新状态,这可能是bit类型的一个优势。 然后,引用[1]提到MySQL中的数值类型,比如int的有符号和无符号,还有zerofill属性。虽然这和bit类型没有直接关系,但可能需要注意bit类型是否支持类似的属性,比如是否能用zerofill,但根据用户的问题,可能不需要涉及这些。 引用[3]和[4]讨论了char和varchar的区别,可能和bit类型无关,但需要确认bit类型在存储和查询时的效率如何,是否有类似定长类型的优势。不过用户的问题主要集中在bit类型本身,所以这部分可能不需要深入。 用户可能的应用场景是什么?比如存储多个开关状态,用bit(M)来节省空间。比如M=8可以存8个布尔值,这样比用8个tinyint(1)更高效。但需要确认MySQL的存储机制,bit类型是否真的是按位存储,还是会有其他开销。 另外,插入数据时,用户可能用b'101'这样的二进制字面量,或者用整数,比如插入5相当于二进制101。但要注意当插入的值超过bit(M)的范围时会发生什么,比如截断还是报错。例如,bit(3)的最大值是7,如果插入8会怎么样?可能需要测试或查文档。 查询的时候,直接select bit类型的字段会显示二进制形式吗?比如bit(3)存储的是5,select会显示b'101'吗?还是显示成其他格式?根据引用[3],可能需要使用函数如BIN()或HEX()来转换,否则可能显示为乱码或者不可读的形式。 另外,关于存储空间,bit(M)的存储空间是大约(M+7)/8字节,比如M=8需要1字节,M=9需要2字节。这点需要确认是否正确,因为不同的数据库可能有不同的存储方式。 还有,bit类型的默认值如何设置?是否可以用二进制字面量或者整数?比如DEFAULT b'1'或者DEFAULT 1。 可能用户会问到bit和tinyint(1)的区别,特别是当存储布尔值时,两者有什么优劣。比如存储空间、查询效率、可读性等方面。需要比较两者,指出bit类型更节省空间,但可能在可读性和操作上不如tinyint方便。 还需要注意版本兼容性问题,比如不同MySQL版本对bit类型的处理是否有变化,比如旧版本是否支持bit类型,或者是否有不同的行为。 可能用户在使用bit类型时遇到的常见问题,比如插入数据时的格式错误,查询时显示不正确,或者应用程序中处理bit类型的问题。例如,某些ORM框架可能对bit类型的支持不够好,导致需要手动处理转换。 此外,性能方面,使用bit类型进行位运算是否高效,比如在where子句中使用位掩码来查询特定位的状态,这样的查询能否利用索引,或者是否会导致全表扫描。 总结下来,我需要组织回答的结构,先介绍bit类型的定义和基本特性,然后讨论如何插入和查询数据,存储机制,应用场景,与其他数据类型的对比,以及常见问题和注意事项。同时,引用相关的资料来支持这些点,比如引用[2]提到的存储多个状态和位操作的优势,引用[3]关于显示需要转换的问题。</think>### MySQL Bit数据类型详解 #### 一、Bit类型定义与基本特性 1. **存储方式** MySQL的`BIT(M)`类型用于存储二进制位数据,其中$M$表示位数,取值范围为$1 \leq M \leq 64$。例如: - `BIT(1)`:存储单个二进制位(0或1),常用于布尔状态。 - `BIT(8)`:存储8位二进制数据(如`b'10101010'`),适用于多状态组合[^2]。 2. **存储空间** 存储空间计算公式为:$\lceil M/8 \rceil$字节。例如: - `BIT(1)`占用1字节(实际最小分配单位); - `BIT(9)`占用2字节。 #### 二、数据操作与查询 1. **插入数据** - 使用二进制字面量:`INSERT INTO table (flags) VALUES (b'101');` - 使用十进制整数:`INSERT INTO table (flags) VALUES (5);`(等价于`b'101'`) - 超出范围的数值会被截断,例如向`BIT(2)`插入`b'111'`会存储为`b'11'`。 2. **查询与显示** 直接查询时可能显示为二进制字符串(如`0x05`)或乱码,需用函数转换: ```sql SELECT flags, BIN(flags), HEX(flags) FROM table; -- 输出二进制或十六进制格式 ``` #### 三、应用场景与优化 1. **多状态存储** 一个`BIT(64)`字段可存储64个独立状态,例如用户权限、开关配置等。通过位运算操作特定状态: ```sql -- 检查第3位是否为1 SELECT * FROM table WHERE flags & b'100'; -- 设置第2位为1 UPDATE table SET flags = flags | b'10'; ``` 2. **对比其他类型** | 类型 | 存储空间 | 适用场景 | 可读性 | |-------------|-------|------------------------|-----| | `BIT(M)` | 紧凑 | 多状态组合、布尔值 | 低 | | `TINYINT(1)`| 1字节 | 简单布尔值(如`0/1`) | 高 | | `VARCHAR` | 变长 | 非二进制数据(如状态描述字符串) | 最高 | #### 四、注意事项 1. **默认值与约束** - 支持默认值设置:`flags BIT(4) DEFAULT b'0011'` - 允许`NOT NULL`约束,但不支持`AUTO_INCREMENT`。 2. **兼容性问题** - 部分ORM框架(如早期Hibernate)可能无法直接解析`BIT`类型,需手动映射为整数或布尔类型。 - 迁移到其他数据库(如PostgreSQL)时,需注意`BIT`类型的语义差异。 #### 五、性能优化建议 - **索引使用**:直接对`BIT`字段创建索引效率较低,建议拆分常用状态到独立字段。 - **位运算优化**:复杂位操作(如`~`、`<<`)可能影响查询性能,需结合业务场景测试。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值