1. 首页
  2. mysql基础

15-十五、详解 MySQL 中的位类型 ( bit )

使用 MySQL 这么多年,这几天是我第一次知道 MySQL 竟然存在 BIT 这种数据类型。位模式的操作,最大名鼎鼎的应该是 「 布隆过滤器 ( Bloom Filter ) 」。

MySQL 中的位模式字面量一般使用 b'val'0bval 语法,val 是只包含 01 的二进制值,字符 b 之前有无 0 都无关紧要,但要注意的是 0b 是区分大小写的,0b 不能写为 0B ,但 b 由不限大小写。b001B001 是一个意思。这也是匪夷所思了。

以下这些是合法的位类型字面量


b'01' B'01' b01

而下面这些,则是非法的位类型字面量


b'2' (2 不是合法的二进制数字 ) B01 (0B 必须是 0b)

默认情况下,位类型的字面量是一个二进制字符串


mysql> SELECT b'1000001', CHARSET(b'1000001'); +------------+---------------------+ | b'1000001' | CHARSET(b'1000001') | +------------+---------------------+ | A | binary | +------------+---------------------+ mysql> SELECT 0b1100001, CHARSET(0b1100001); +-----------+--------------------+ | 0b1100001 | CHARSET(0b1100001) | +-----------+--------------------+ | a | binary | +-----------+--------------------+

位类型字面量可以有一个可选的字符集介绍器和 COLLATE 子句,用于指定为使用特定字符集和排序规则的字符串


[_charset_name] b'val' [COLLATE collation_name]

例如


mysql> SELECT _latin1 b'1000001'; +--------------------+ | _latin1 b'1000001' | +--------------------+ | A | +--------------------+ row in set (0.01 sec) mysql> SELECT _utf8 0b1000001 COLLATE utf8_danish_ci; +----------------------------------------+ | _utf8 0b1000001 COLLATE utf8_danish_ci | +----------------------------------------+ | A | +----------------------------------------+ row in set (0.02 sec)

注意: 示例使用 b'val' 表示法,但 0bval 表示法也是可以的

在数值上下文中,MySQL 会把位类型的数据转换为相应的整型。所以,如果要确保对位类型字面值进行数字处理,请在数字上下文中使用它。

至于如何做到这一点,可以在把这个位类型数据进行 + 0 操作或者使用 CAST (... AS UNSIGNED) 转换器。

例如,默认情况下,分配给用户定义变量的位字面量是二进制字符串。如果要将值指定为数字,请在数字上下文中使用它:


mysql> SET @v1 = b'1100001'; mysql> SET @v2 = b'1100001'+0; mysql> SET @v3 = CAST(b'1100001' AS UNSIGNED); mysql> SELECT @v1, @v2, @v3; +------+------+------+ | @v1 | @v2 | @v3 | +------+------+------+ | a | 97 | 97 | +------+------+------+

空位值 b'' 将被计算为零长度二进制字符串。转换为数字则位 0


mysql> SELECT CHARSET(b''), LENGTH(b''); +--------------+-------------+ | CHARSET(b'') | LENGTH(b'') | +--------------+-------------+ | binary | 0 | +--------------+-------------+ mysql> SELECT b''+0; +-------+ | b''+0 | +-------+ | 0 | +-------+

位类型的 0bb 语法可以方便的指定要分配给 BIT 列的值


mysql> CREATE TABLE t (b BIT(8)); mysql> INSERT INTO t SET b = b'11111111'; mysql> INSERT INTO t SET b = b'1010'; mysql> INSERT INTO t SET b = b'0101';

在查询时,结果集中的位值将作为二进制值返回,可读性就会差很多,这时候我们可以将它们转换为十进制或者十六进制,我们可以使用转换函数 bin()hex() 两个函数来完成这种转换。转换的时候会忽略高位中的 0


mysql> SELECT b+0, BIN(b), OCT(b), HEX(b) FROM t; +------+----------+--------+--------+ | b+0 | BIN(b) | OCT(b) | HEX(b) | +------+----------+--------+--------+ | 255 | 11111111 | 377 | FF | | 10 | 1010 | 12 | A | | 5 | 101 | 5 | 5 | +------+----------+--------+--------+

对于位类型,位操作被视为应当在数字上下文中进行,但在 MySQL 8.0 及更高的版本中,可以直接使用位操作数字或二进制字符串参数

在这种情况下,就至少要位其中一个参数使用 _binary 介绍器,将位类型的数据指定为二进制字符串上下文


mysql> SET @v1 = b'000010101' | b'000101010'; mysql> SET @v2 = _binary b'000010101' | _binary b'000101010'; mysql> SELECT HEX(@v1), HEX(@v2); +----------+----------+ | HEX(@v1) | HEX(@v2) | +----------+----------+ | 3F | 003F | +----------+----------+

在上面这个范例中,两个位操作的显示结果类似,但没有 _binary 的结果是 BIGINT 值,而 _binary 的结果是二进制字符串。由于结果类型不同,显示的值不同:数字结果不显示高位 0

希望读者能够给小编留言,也可以点击[此处扫下面二维码关注微信公众号](https://www.ycbbs.vip/?p=28 "此处扫下面二维码关注微信公众号")

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
  4. JS中文网,Javascriptc中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,是给开发者用的 Hacker News,技术文章由为你筛选出最优质的干货,其中包括:Android、iOS、前端、后端等方面的内容。目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。

    本文著作权归作者所有,如若转载,请注明出处

    转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com

    标题:15-十五、详解 MySQL 中的位类型 ( bit )

    链接:https://www.javajike.com/article/1630.html

« 16-十六、MySQL 中数据类型的默认值 – default 约束
14-十四、雪上加霜的 MySQL 浮点类型 ( float 和 double )»

相关推荐

QR code