MySQL的OCTET_LENGTH()函数用于返回字符串的字节长度,在明确字符集对应规则的前提下,可以通过该函数间接计算数据列中存储的字符数。该函数会直接返回参数对应的字节数,不同字符集下单个字符占用的字节数不同,因此计算字符数时需要结合字符集特性处理。

OCTET_LENGTH()函数基本语法
OCTET_LENGTH()函数的语法非常简单,接收一个字符串参数,返回该字符串的字节长度,语法格式如下:
-- 基本语法 OCTET_LENGTH(str) -- str为需要计算字节长度的字符串,可以是字段名、字符串常量或者表达式
如果传入的参数为NULL,函数会直接返回NULL,使用时需要注意空值的处理。
不同场景下的使用示例
1. 计算字符串常量的字节长度
以常见的utf8mb4字符集为例,演示不同字符的字节长度计算:
-- 查看当前会话字符集
SELECT @@character_set_connection;
-- 计算英文字符的字节长度,utf8mb4下英文字符占1字节
SELECT OCTET_LENGTH('abc') AS byte_length;
-- 返回结果:3
-- 计算中文字符的字节长度,utf8mb4下中文占3字节
SELECT OCTET_LENGTH('测试') AS byte_length;
-- 返回结果:6
-- 计算表情符号的字节长度,utf8mb4下表情占4字节
SELECT OCTET_LENGTH('😊') AS byte_length;
-- 返回结果:4
2. 计算数据列的字节长度
假设存在一张用户表user_info,其中username字段存储用户名称,需要统计每个用户名称的字节长度,可执行以下查询:
-- 创建测试表
CREATE TABLE user_info (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50)
) CHARACTER SET utf8mb4;
-- 插入测试数据
INSERT INTO user_info (username) VALUES ('张三'), ('lisi'), ('王五abc');
-- 查询每个用户名的字节长度
SELECT id, username, OCTET_LENGTH(username) AS username_byte_length FROM user_info;
执行后可以得到每个username字段值的字节长度,结果如下:
| id | username | username_byte_length |
|---|---|---|
| 1 | 张三 | 6 |
| 2 | lisi | 4 |
| 3 | 王五abc | 9 |
如何计算实际字符数
OCTET_LENGTH()返回的是字节长度,要得到字符数需要结合当前字符集下单字符的字节数计算。如果是单字节字符集(如latin1),字节长度等于字符数,直接使用OCTET_LENGTH()的结果即可。如果是多字节字符集,需要先确认字符集的单字符字节规则:
- latin1字符集:1字符=1字节,字符数=OCTET_LENGTH(str)
- utf8字符集:1字符=1-3字节,无法直接通过字节数反推字符数
- utf8mb4字符集:1字符=1-4字节,无法直接通过字节数反推字符数
如果需要准确计算字符数,更推荐使用CHAR_LENGTH()函数,该函数直接返回字符串的字符数,不受字符集影响:
-- 对比OCTET_LENGTH和CHAR_LENGTH的结果
SELECT
username,
OCTET_LENGTH(username) AS byte_length,
CHAR_LENGTH(username) AS char_length
FROM user_info;
OCTET_LENGTH()和CHAR_LENGTH()的区别
两个函数的核心差异如下:
| 对比项 | OCTET_LENGTH() | CHAR_LENGTH() |
|---|---|---|
| 返回值含义 | 字符串的字节长度 | 字符串的字符数 |
| 字符集影响 | 受字符集影响,不同字符集下单字符字节数不同 | 不受字符集影响,直接统计字符个数 |
| 适用场景 | 需要统计存储占用字节数的场景 | 需要统计实际字符个数的场景 |
注意事项
- 如果字段允许存储NULL值,使用OCTET_LENGTH()计算时需要提前过滤NULL,或者使用COALESCE函数处理空值,避免返回结果异常。
- 对于BLOB类型的字段,OCTET_LENGTH()同样适用,会返回该字段存储的二进制数据的字节长度。
- 不要将OCTET_LENGTH()和
LENGTH()函数混淆,在MySQL中LENGTH()函数和OCTET_LENGTH()功能完全一致,是同一个函数的不同名称。
总结:OCTET_LENGTH()函数用于返回字符串的字节长度,若要计算数据列的字符数,在单字节字符集下可直接使用该函数结果,多字节字符集下建议使用CHAR_LENGTH()函数获取准确的字符数。
MySQLOCTET_LENGTH字符数计算数据列统计修改时间:2026-07-20 20:18:32