在 Oracle 数据库中,LENGTH() 和 LENGTHB() 是两个用于计算字符串长度的函数,但它们的计量单位不同,适用于不同场景。以下是详细对比:
✅ 1. LENGTH(string) —— 按字符(Character)计数
- 返回值:字符串中的 字符个数。
- 与字符集无关:无论一个字符占多少字节(如英文 1 字节,汉字 3 字节),都算作 1 个字符。
- 等价于:
LENGTHC(string)(显式按字符计数)。
示例:
SELECT
LENGTH('A') AS len_a, -- 1
LENGTH('你好') AS len_cn, -- 2(两个汉字)
LENGTH('Hello世界') AS len_mix -- 7(5 英文 + 2 汉字)
FROM DUAL;
✅ 适用于业务逻辑判断,如:“内容是否超过 100 个字”。
✅ 2. LENGTHB(string) —— 按字节(Byte)计数
- 返回值:字符串在数据库字符集下所占的 字节数。
- 依赖数据库字符集:
- 如果是
AL32UTF8(UTF-8):英文 1 字节,汉字通常 3 字节。 - 如果是
ZHS16GBK:英文 1 字节,汉字 2 字节。
- 如果是
示例(假设字符集为 AL32UTF8):
SELECT
LENGTHB('A') AS byte_a, -- 1
LENGTHB('你好') AS byte_cn, -- 6(2 汉字 × 3 字节)
LENGTHB('Hello世界') AS byte_mix -- 13(5×1 + 2×3 = 11?实际“界”“世”各3字节 → 5+6=11)
FROM DUAL;
⚠️ 注意:某些生僻字或 Emoji 在 UTF-8 中可能占 4 字节,所以
LENGTHB结果可能大于LENGTH × 3。
🔍 对比总结
| 函数 | 单位 | 是否受字符集影响 | 典型用途 |
|---|---|---|---|
LENGTH() |
字符数 | ❌ 否 | 业务校验(如“不超过 100 字”) |
LENGTHB() |
字节数 | ✅ 是 | 存储空间评估、字段定义限制检查 |
🛠️ 实际应用场景
场景 1:检查是否超出 VARCHAR2(4000 BYTE) 限制
-- 查找可能因字节超限而插入失败的数据
SELECT content
FROM my_table
WHERE LENGTHB(content) > 4000;
因为
VARCHAR2(4000)默认是 4000 字节,不是 4000 字符!
场景 2:检查是否超出 VARCHAR2(4000 CHAR) 限制
-- 查找字符数超限的数据(如果字段定义为 CHAR 语义)
SELECT content
FROM my_table
WHERE LENGTH(content) > 4000;
💡 其他相关函数
| 函数 | 说明 |
|---|---|
LENGTHC(str) |
显式按字符 计数(等同于 LENGTH) |
LENGTH2(str) |
按UCS2 编码 的字节数(一般不用) |
LENGTH4(str) |
按UCS4 编码 的字节数(一般不用) |
📌 在绝大多数情况下,只需关注
LENGTH(字符)和LENGTHB(字节)。
✅ 最佳实践建议
-
**业务逻辑用
LENGTH()**例如:“审批意见不能超过 500 字” →WHERE LENGTH(opinion) > 500 -
**存储/性能分析用
LENGTHB()**例如:估算表大小、排查 ORA-01401(插入值太长)错误。 -
定义字段时明确语义
-- 推荐:显式指定 CHAR,避免字节限制导致汉字存不全 content VARCHAR2(1000 CHAR)
🔧 验证你的数据库字符集
SELECT * FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
NLS_CHARACTERSET:决定VARCHAR2、CHAR的编码(影响LENGTHB)NLS_NCHAR_CHARACTERSET:决定NVARCHAR2、NCHAR的编码(通常是 AL16UTF16)
总结一句话:
LENGTH()数“字”,LENGTHB()数“字节” —— 想知道写了多少字用前者,想知道占多少空间用后者。