BIT_LENGTH、LENGTH和CHAR_LENGTH函数的区别

在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,表示不相同,即含有汉字

你可能感兴趣的:(BIT_LENGTH、LENGTH和CHAR_LENGTH函数的区别)