在MySQL中經(jīng)常需要查看某列文本的長度,因此簡單總結(jié)下3個統(tǒng)計長度的函數(shù)伶授。
需要注意的是断序,對于中文存儲而言,不同的字符集占用的字節(jié)長度也會有差異谎砾。常用到存儲中文的幾種字符集占用長度如下:
字符集 | 占用字節(jié)長度 |
---|---|
utf8mb4 | 漢字3個字節(jié)逢倍,1個字符,英文1個字節(jié) |
gbk/gb2312 | 漢字2個字節(jié)景图,1個字符较雕,英文1個字節(jié) |
latin1 | 漢字2個字符,2個字節(jié)挚币,英文1個字節(jié) |
PS:換算關(guān)系為1byte=8bit
BIT_LENGTH()
BIT_LENGTH()函數(shù)返回傳入?yún)?shù)的比特長度亮蒋。
看下面的例子
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個字節(jié),因此比特長度為2×2×8 = 32比特妆毕。
LENGTH()
LENGTH()函數(shù)使我們經(jīng)常用的函數(shù)慎玖,用于統(tǒng)計字符的字節(jié)長度,同樣收到字符集的影響笛粘。例如
CREATE TABLE ts5(
info CHAR(10)
) CHARSET = utf8mb4;
INSERT INTO ts5 VALUES('中國');
SELECT LENGTH(info) FROM ts5;
length(info)
--------------
6
在utf8字符集下趁怔,一個漢字占用3個字節(jié),因此兩個漢字占用6個字節(jié)薪前。
CHAR_LENGTH()
CHAR_LENGTH()函數(shù)返回字符串的字符長度润努,在gbk/gb2312/utf8字符集下,無論漢字還是英文示括,都算一個字符铺浇,因此在這些字符集下CHAR_LENGTH()函數(shù)表現(xiàn)一致。
SELECT CHAR_LENGTH(info) FROM ts4 UNION ALL SELECT CHAR_LENGTH(info) FROM ts5;
char_length(info)
-------------------
2
2
更多技巧
中文和英文在CHAR_LENGTH()函數(shù)下表現(xiàn)一致,而在LENGTH()下卻返回不一樣的結(jié)果垛膝,因此可以巧妙利用這一點來判斷字符串中是否用中文鳍侣。
SELECT LENGTH('HELLO') <> CHAR_LENGTH('HELLO'); # 0,表示相同丁稀,即為全英文
SELECT LENGTH('中國NB') <> CHAR_LENGTH('中國NB'); # 1,表示不相同倚聚,即含有漢字