在MySQL中经常需要查看某列文本的长度,因此简单总结下3个统计长度的函数。
需要注意的是,对于中文存储而言,不同的字符集占用的字节长度也会有差异。常用到存储中文的几种字符集占用长度如下:
字符集 | 占用字节长度 |
---|---|
utf8mb4 | 汉字3个字节,1个字符,英文1个字节 |
gbk/gb2312 | 汉字2个字节,1个字符,英文1个字节 |
latin1 | 汉字2个字符,2个字节,英文1个字节 |
PS:换算关系为1byte=8bit
BIT_LENGTH()
BIT_LENGTH()函数返回传入参数的比特长度。
看下面的例子
CREATE TABLE ts4 (
info CHAR(10)
) ENGINE=INNODB CHARACTER SET = gbk;
INSERT INTO ts4 VALUES('中国');
select BIT_LENGTH(info) from ts4;
bit_length(info)
------------------
32
因为gbk字符集下一个汉字占2个字节,因此比特长度为2×2×8 = 32比特。
LENGTH()
LENGTH()函数使我们经常用的函数,用于统计字符的字节长度,同样收到字符集的影响。例如
CREATE TABLE ts5(
info CHAR(10)
) CHARSET = utf8mb4;
INSERT INTO ts5 VALUES('中国');
SELECT LENGTH(info) FROM ts5;
length(info)
--------------
6
在utf8字符集下,一个汉字占用3个字节,因此两个汉字占用6个字节。
CHAR_LENGTH()
CHAR_LENGTH()函数返回字符串的字符长度,在gbk/gb2312/utf8字符集下,无论汉字还是英文,都算一个字符,因此在这些字符集下CHAR_LENGTH()函数表现一致。
SELECT CHAR_LENGTH(info) FROM ts4 UNION ALL SELECT CHAR_LENGTH(info) FROM ts5;
char_length(info)
-------------------
2
2
更多技巧
中文和英文在CHAR_LENGTH()函数下表现一致,而在LENGTH()下却返回不一样的结果,因此可以巧妙利用这一点来判断字符串中是否用中文。
SELECT LENGTH('HELLO') <> CHAR_LENGTH('HELLO'); # 0,表示相同,即为全英文
SELECT LENGTH('中国NB') <> CHAR_LENGTH('中国NB'); # 1,表示不相同,即含有汉字