IDEA2023.1.3破解,IDEA破解,IDEA 2023.1破解,最新IDEA激活码

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

IDEA2023.1.3破解,IDEA破解,IDEA 2023.1破解,最新IDEA激活码

文章永久连接:https://tech.souyunku.com/?p=5709

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

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

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

b'01'
B'01'
0b01

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

b'2'    (2 不是合法的二进制数字 )
0B01    (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                  |
+--------------------+
1 row in set (0.01 sec)

mysql> SELECT _utf8 0b1000001 COLLATE utf8_danish_ci;
+----------------------------------------+
| _utf8 0b1000001 COLLATE utf8_danish_ci |
+----------------------------------------+
| A                                      |
+----------------------------------------+
1 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

干货推荐

本站推荐:精选优质专栏

专栏汇总:Redis 教程

专栏汇总:MySQL 教程

专栏汇总:MongoDB 教程

专栏汇总:Memcached 教程

附录:MySQL 拾遗:系列文章


Warning: A non-numeric value encountered in /data/wangzhan/tech.souyunku.com.wp/wp-content/themes/dux/functions-theme.php on line 1154
赞(60) 打赏



未经允许不得转载:搜云库技术团队 » 十五、详解 MySQL 中的位类型 ( bit )

IDEA2023.1.3破解,IDEA破解,IDEA 2023.1破解,最新IDEA激活码
IDEA2023.1.3破解,IDEA破解,IDEA 2023.1破解,最新IDEA激活码

评论 抢沙发

大前端WP主题 更专业 更方便

联系我们联系我们

觉得文章有用就打赏一下文章作者

微信扫一扫打赏

微信扫一扫打赏


Fatal error: Uncaught Exception: Cache directory not writable. Comet Cache needs this directory please: `/data/wangzhan/tech.souyunku.com.wp/wp-content/cache/comet-cache/cache/https/tech-souyunku-com/index.q`. Set permissions to `755` or higher; `777` might be needed in some cases. in /data/wangzhan/tech.souyunku.com.wp/wp-content/plugins/comet-cache/src/includes/traits/Ac/ObUtils.php:367 Stack trace: #0 [internal function]: WebSharks\CometCache\Classes\AdvancedCache->outputBufferCallbackHandler() #1 /data/wangzhan/tech.souyunku.com.wp/wp-includes/functions.php(5109): ob_end_flush() #2 /data/wangzhan/tech.souyunku.com.wp/wp-includes/class-wp-hook.php(303): wp_ob_end_flush_all() #3 /data/wangzhan/tech.souyunku.com.wp/wp-includes/class-wp-hook.php(327): WP_Hook->apply_filters() #4 /data/wangzhan/tech.souyunku.com.wp/wp-includes/plugin.php(470): WP_Hook->do_action() #5 /data/wangzhan/tech.souyunku.com.wp/wp-includes/load.php(1097): do_action() #6 [internal function]: shutdown_action_hook() #7 {main} thrown in /data/wangzhan/tech.souyunku.com.wp/wp-content/plugins/comet-cache/src/includes/traits/Ac/ObUtils.php on line 367