Mysql关于bit类型的用法
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)
这是十六进制的值
------------------------------------------------
mysql> select uid, bin(login_days_3g), bin(login_days_wap), bin(login_days_client) from month_visit_user_3g_201205 limit 10;
+-----------+---------------------------------+---------------------------------+---------------------------------+
| uid | bin(login_days_3g) | bin(login_days_wap) | bin(login_days_client) |
+-----------+---------------------------------+---------------------------------+---------------------------------+
| 222451743 | 1111111111111111111111111111111 | 1001010000000000000000000000000 | 1111111111111111111111111111111 |
| 232336555 | 1011010101111101000001011111101 | 1001000000000000000000000000000 | 1011010101111101000001011111101 |
| 263922954 | 1101111111111111111111111110111 | 1101111111111111111111100000000 | 100000000000000000000011110111 |
| 340421490 | 111111011101001111010111101 | 0 | 111111011101001111010111101 |
| 391362651 | 1111111111111111111111111111111 | 1111111111111111111111111111111 | 1000100100000000000000001111 |
| 243815473 | 101100000000100101110100010001 | 0 | 101100000000100101110100010001 |
| 265655422 | 1111111111111111111111111111111 | 1111111111111111111111111111111 | 1111111111111111111011111111111 |
| 280646224 | 10000001111111111 | 1111111111 | 10000001000000001 |
| 280831000 | 1001001000100011111111111111 | 0 | 1001001000100011111111111111 |
| 4859 | 1111101011111111111111111111011 | 0 | 1111101011111111111111111111011 |
+-----------+---------------------------------+---------------------------------+---------------------------------+
10 rows in set (0.00 sec)
mysql> select uid, bin(login_days_3g), bin(login_days_wap), bin(login_days_client) from month_visit_user_3g_201205 limit 20;
+-----------+---------------------------------+---------------------------------+---------------------------------+
| uid | bin(login_days_3g) | bin(login_days_wap) | bin(login_days_client) |
+-----------+---------------------------------+---------------------------------+---------------------------------+
| 222451743 | 1111111111111111111111111111111 | 1001010000000000000000000000000 | 1111111111111111111111111111111 |
| 232336555 | 1011010101111101000001011111101 | 1001000000000000000000000000000 | 1011010101111101000001011111101 |
| 263922954 | 1101111111111111111111111110111 | 1101111111111111111111100000000 | 100000000000000000000011110111 |
| 340421490 | 111111011101001111010111101 | 0 | 111111011101001111010111101 |
| 391362651 | 1111111111111111111111111111111 | 1111111111111111111111111111111 | 1000100100000000000000001111 |
| 243815473 | 101100000000100101110100010001 | 0 | 101100000000100101110100010001 |
| 265655422 | 1111111111111111111111111111111 | 1111111111111111111111111111111 | 1111111111111111111011111111111 |
| 280646224 | 10000001111111111 | 1111111111 | 10000001000000001 |
| 280831000 | 1001001000100011111111111111 | 0 | 1001001000100011111111111111 |
| 4859 | 1111101011111111111111111111011 | 0 | 1111101011111111111111111111011 |
| 18991 | 1001100111111011001 | 0 | 1001100111111011001 |
| 19770 | 10111111 | 10000000 | 111111 |
| 32885 | 1100000000010001111111 | 1000000000010000000000 | 1100000000000001111111 |
| 39801 | 1000000011100000001111001011 | 0 | 1000000011100000001111001011 |
| 41437 | 1111111111111111111111111111111 | 10000000000000000100000000000 | 1111111111111111111111111111111 |
| 41542 | 111111 | 0 | 111111 |
| 45626 | 1111111111111111111111111111111 | 0 | 1111111111111111111111111111111 |
| 55339 | 1111111111111110111111111111111 | 0 | 1111111111111110111111111111111 |
| 59130 | 11111111111111111111111 | 0 | 11111111111111111111111 |
| 61131 | 1111111 | 0 | 1111111 |
+-----------+---------------------------------+---------------------------------+---------------------------------+
20 rows in set (0.12 sec)
mysql> select uid, bin(login_days_3g+0), bin(login_days_wap+0), bin(login_days_client+0) from month_visit_user_3g_201205 limit 20;
+-----------+---------------------------------+---------------------------------+---------------------------------+
| uid | bin(login_days_3g+0) | bin(login_days_wap+0) | bin(login_days_client+0) |
+-----------+---------------------------------+---------------------------------+---------------------------------+
| 222451743 | 1111111111111111111111111111111 | 1001010000000000000000000000000 | 1111111111111111111111111111111 |
| 232336555 | 1011010101111101000001011111101 | 1001000000000000000000000000000 | 1011010101111101000001011111101 |
| 263922954 | 1101111111111111111111111110111 | 1101111111111111111111100000000 | 100000000000000000000011110111 |
| 340421490 | 111111011101001111010111101 | 0 | 111111011101001111010111101 |
| 391362651 | 1111111111111111111111111111111 | 1111111111111111111111111111111 | 1000100100000000000000001111 |
| 243815473 | 101100000000100101110100010001 | 0 | 101100000000100101110100010001 |
| 265655422 | 1111111111111111111111111111111 | 1111111111111111111111111111111 | 1111111111111111111011111111111 |
| 280646224 | 10000001111111111 | 1111111111 | 10000001000000001 |
| 280831000 | 1001001000100011111111111111 | 0 | 1001001000100011111111111111 |
| 4859 | 1111101011111111111111111111011 | 0 | 1111101011111111111111111111011 |
| 18991 | 1001100111111011001 | 0 | 1001100111111011001 |
| 19770 | 10111111 | 10000000 | 111111 |
| 32885 | 1100000000010001111111 | 1000000000010000000000 | 1100000000000001111111 |
| 39801 | 1000000011100000001111001011 | 0 | 1000000011100000001111001011 |
| 41437 | 1111111111111111111111111111111 | 10000000000000000100000000000 | 1111111111111111111111111111111 |
| 41542 | 111111 | 0 | 111111 |
| 45626 | 1111111111111111111111111111111 | 0 | 1111111111111111111111111111111 |
| 55339 | 1111111111111110111111111111111 | 0 | 1111111111111110111111111111111 |
| 59130 | 11111111111111111111111 | 0 | 11111111111111111111111 |
| 61131 | 1111111 | 0 | 1111111 |
+-----------+---------------------------------+---------------------------------+---------------------------------+
20 rows in set (0.12 sec)
----------------------------
3.6 . 8 . 根据天计算访问量
下面的例子显示了如何使用位组函数来计算每个月中用户访问网页的天数。
CREATE TABLE t1 ( year YEAR ( 4 ), month INT ( 2 ) UNSIGNED ZEROFILL,
day INT ( 2 ) UNSIGNED ZEROFILL);
INSERT INTO t1 VALUES ( 2000 , 1 , 1 ),( 2000 , 1 , 20 ),( 2000 , 1 , 30 ),( 2000 , 2 , 2 ),
( 2000 , 2 , 23 ),( 2000 , 2 , 23 );
示例表中含有代表用户访问网页的年-月-日值。可以使用以下查询来确定每个月的访问天数:
SELECT year , month ,BIT_COUNT(BIT_OR( 1 << day )) AS days FROM t1
GROUP BY year , month ;
将返回:
+ -- ----+-------+------+
| year | month | days |
+ -- ----+-------+------+
| 2000 | 01 | 3 |
| 2000 | 02 | 2 |
+ -- ----+-------+------+
该查询计算了在表中按年 / 月组合的不同天数,可以自动去除重复的询问。
上面例子中的查询语句:
SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1 GROUP BY year,month;
中的”BIT_COUNT(BIT_OR(1<<day))
“用法比较有技巧。
1、BIT_COUNT( expr ):返回 expr 的二进制表达式中”1“的个数。
例如:29 = 11101 则:BIT_COUNT(29)= 4;
2、BIT_OR( expr ):返回 expr 中所有比特的bitwise OR。计算执行的精确度为64比特(BIGINT) 。
例如:上面例子中,2000年02月中有一条2号的记录两条23号的记录,所以"1<<day"表示出来就是 “1<<2”和“1<<23”,得到二进制数 100 和 100000000000000000000000 。然后再OR运算。即 100 OR 10000000000000000000000 OR 10000000000000000000000 = 100000000000000000000100;这样再用BIT_COUNT处理得出的值就是2,自动去除了重复的日期。
---------------------------------------------
5月27--5月31
mysql> select count(uid) from month_visit_user_3g_201205 where (login_days_3g & (b'11111' << 26)) !=0 limit 10;
+------------+
| count(uid) |
+------------+
| 10610606 |
+------------+
1 row in set (9.19 sec)
6月1日-6月2日
mysql> select count(uid) from month_visit_user_3g_201206 where (login_days_3g & (b'11' << 0)) !=0 limit 10;
+------------+
| count(uid) |
+------------+
| 9299252 |
+------------+
1 row in set (3.14 sec)