MySQL: MySQL计算字段长度/大小函数的对比 (length / bit_length / char_length)
适用于MySQL 5.6及以上
注意:
char_length
、length
、bit_length
函数只是用于计算字符串数据的长度。CHAR
和VARCHAR
实际存储开销比数据要大,详情参见《MySQL中VARCHAR最大长度是多少?CHAR和VARCHAR有哪些区别?》- 非字符串类型,在《MySQL所有类型的字段长度、取值范围、存储开销(区分显示宽度/有无符号)》中有详细拆解。
如需评估数据库/表/行的存储开销,可以参考《MySQL如何评估数据量(行大小、数据存储和索引存储)》
定义
char_length
、length
、bit_length
都是MySQL内置的字符串函数,用于计算字符串的长度1。
- 非字符串会先转为字符串,再执行长度计算
char_length
与CHARACTER_LENGTH
函数作用相同
区别
三个函数计算的单位不同:
char_length
:字符length
:字节(Byte)bit_length
:二进制位(bit)。
例:中文环境下常见的是汉字的区别,一个汉字的长度(UTF8编码),分别为1、3、24
字符集是关键因素,utf8mb4下,单字符最多可占用4个字节。
测试
字符集为UTF8
:
select char_length("12"), char_length("ab"), char_length("中文")
select length("12"), length("ab"), length("中文")
select bit_length("12"), bit_length("ab"), bit_length("中文")
结果:
函数 | 数字 (12) |
字母 (ab) |
中文 (中文) |
---|---|---|---|
char_length |
2 | 2 | 2 |
length |
2 | 2 | 6 |
bit_length |
16 | 16 | 48 |
总结
命令 | 单位 | 一个汉字 | 一个数字or字母 | 示例 |
---|---|---|---|---|
char_length |
字符 | 1 | 1 | char_length(str) |
length |
Byte | 3 | 1 | length(str) |
bit_length |
bit | 24 | 8 | length(str) |
当字符串的长度,超过max_allowed_packet
定义的最大长度,上述函数将返回NULL。
max_allowed_packet
一般默认为4MB(5.6.5及以下为1MB)2
- 如需了解MySQL所有类型的长度定义、存储开销,可以参考《MySQL所有类型的长度范围、存储开销(区分显示宽度/有无符号)》
- 如需评估数据库/表/行的存储开销,可以参考《MySQL如何评估数据量(行大小、数据存储和索引存储)》
- 更多基础命令可参考《https://learn.blog.csdn.net/article/category/9232935》
参考:
- MySQL官方文档 - 字符串函数与运算符:https://dev.mysql.com/doc/refman/5.6/en/string-functions.html
- MySQL官方文档 - 服务器系统变量集:https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_max_allowed_packet