本文介绍GBase 8a数据库集群的bit_length函数的语法、使用说明和例子。
目录导航
语法
BIT_LENGTH(str)
说明
返回字符串 str 的比特长度,以比特进行计算。
注意必须是字符串,如果你输入的是数字,会先转换成对应的字符串,比如10,他会变成'10'来处理,而不是数字10。
空字符串返回长度0
null值返回 null.
样例
字符串ASCII
每个ASCII字符占用8位。空字符串返回0.
gbase> select bit_length('');
+----------------+
| bit_length('') |
+----------------+
| 0 |
+----------------+
1 row in set (Elapsed: 00:00:00.00)
gbase> select bit_length('A');
+-----------------+
| bit_length('A') |
+-----------------+
| 8 |
+-----------------+
1 row in set (Elapsed: 00:00:00.00)
gbase> select bit_length('AB');
+------------------+
| bit_length('AB') |
+------------------+
| 16 |
+------------------+
1 row in set (Elapsed: 00:00:00.00)
gbase> select bit_length('ABC');
+-------------------+
| bit_length('ABC') |
+-------------------+
| 24 |
+-------------------+
1 row in set (Elapsed: 00:00:00.00)
gbase> select bit_length('ABCD');
+--------------------+
| bit_length('ABCD') |
+--------------------+
| 32 |
+--------------------+
1 row in set (Elapsed: 00:00:00.00)
汉字
UTF8编码
每个占用3个字节24位。
gbase> select bit_length('中');
+-------------------+
| bit_length('中') |
+-------------------+
| 24 |
+-------------------+
1 row in set (Elapsed: 00:00:00.00)
gbase> select bit_length('中国');
+----------------------+
| bit_length('中国') |
+----------------------+
| 48 |
+----------------------+
1 row in set (Elapsed: 00:00:00.00)
GBK编码
每个字符占用2个字节,16位。
gbase> create table t_gbk(name varchar(100))default charset=gbk;
Query OK, 0 rows affected (Elapsed: 00:00:00.42)
gbase> insert into t_gbk values('中'),('中国');
Query OK, 2 rows affected (Elapsed: 00:00:00.27)
Records: 2 Duplicates: 0 Warnings: 0
gbase> select name,bit_length(name) from t_gbk
-> ;
+--------+------------------+
| name | bit_length(name) |
+--------+------------------+
| 中 | 16 |
| 中国 | 32 |
+--------+------------------+
2 rows in set (Elapsed: 00:00:00.01)
数字
直接数字
参数直接写数字,会被先转化成对应的字符串。与预期不符。如下数字10对应0xA只占用8位,但10变成了'10' 则占用了16位。
gbase> select bit_length(1);
+---------------+
| bit_length(1) |
+---------------+
| 8 |
+---------------+
1 row in set (Elapsed: 00:00:00.00)
gbase> select bit_length(10);
+----------------+
| bit_length(10) |
+----------------+
| 16 |
+----------------+
1 row in set (Elapsed: 00:00:00.01)
用hex转换成数字
用hex避免了字符串的转换,而是改成了16进制数,其长度符合预期。
gbase> select hex(10),bit_length(hex(10));
+---------+---------------------+
| hex(10) | bit_length(hex(10)) |
+---------+---------------------+
| A | 8 |
+---------+---------------------+
1 row in set (Elapsed: 00:00:00.00)
gbase> select hex(100),bit_length(hex(100));
+----------+----------------------+
| hex(100) | bit_length(hex(100)) |
+----------+----------------------+
| 64 | 16 |
+----------+----------------------+
1 row in set (Elapsed: 00:00:00.00)
gbase> select hex(257),bit_length(hex(257));
+----------+----------------------+
| hex(257) | bit_length(hex(257)) |
+----------+----------------------+
| 101 | 24 |
+----------+----------------------+
1 row in set (Elapsed: 00:00:00.00)
16进制数
直接用16进制表达形式,可以获得正确的结果。
gbase> select bit_length(x'AA');
+-------------------+
| bit_length(x'AA') |
+-------------------+
| 8 |
+-------------------+
1 row in set (Elapsed: 00:00:00.00)
gbase> select bit_length(x'AABB');
+---------------------+
| bit_length(x'AABB') |
+---------------------+
| 16 |
+---------------------+
NULL值
gbase> select bit_length(null);
+------------------+
| bit_length(null) |
+------------------+
| NULL |
+------------------+
1 row in set (Elapsed: 00:00:00.00)