在 Oracle 数据库中,LENGTH 和 LENGTHB 是两个用于计算字符串长度的函数,它们的核心区别在于:一个按字符计数,一个按字节计数。以下是详细对比:
✅ 一、核心区别总结
| 函数 | 含义 | 单位 | 是否受字符集影响 |
|---|---|---|---|
LENGTH(str) |
返回字符串的 字符个数 | 字符(characters) | ❌ 不受影响(只数"字") |
LENGTHB(str) |
返回字符串的 字节长度 | 字节(bytes) | ✅ 受数据库字符集影响 |
💡 简单记:
LENGTH→ L ength of CharactersLENGTHB→ L ength in Bytes
二、详细说明与示例
假设数据库字符集为 AL32UTF8(Oracle 的 UTF-8 实现):
- 英文字符(如
'A')占 1 字节 - 中文字符(如
'你')占 3 字节 - Emoji(如
'😊')在AL32UTF8中 无法存储 (需AL16UTF16),此处不讨论
示例 1:基本用法
sql
SELECT
LENGTH('Hello') AS len_char, -- 5(5个字符)
LENGTHB('Hello') AS len_byte -- 5(5字节)
FROM dual;
示例 2:包含中文
sql
SELECT
LENGTH('你好') AS len_char, -- 2(2个汉字)
LENGTHB('你好') AS len_byte -- 6(2 × 3 = 6 字节)
FROM dual;
示例 3:混合内容
sql
SELECT
LENGTH('Hello你好') AS len_char, -- 7(5英文 + 2中文)
LENGTHB('Hello你好') AS len_byte -- 11(5×1 + 2×3 = 11)
FROM dual;
三、其他相关函数(扩展)
Oracle 还提供了更细粒度的长度函数:
| 函数 | 说明 |
|---|---|
LENGTHC(str) |
返回 Unicode 字符数 (对 Unicode 安全,在 AL16UTF16 下有意义) |
LENGTH2(str) |
返回 UCS2 编码下的字节数(已过时,一般不用) |
LENGTH4(str) |
返回 UCS4 编码下的字节数(已过时) |
📌 日常推荐只用
LENGTH和LENGTHB,其余函数在现代应用中极少使用。
四、与 MySQL 对比(便于理解)
| 功能 | Oracle | MySQL |
|---|---|---|
| 字符数 | LENGTH(str) |
CHAR_LENGTH(str) 或 CHARACTER_LENGTH(str) |
| 字节数 | LENGTHB(str) |
LENGTH(str) |
⚠️ 注意:Oracle 的
LENGTH≈ MySQL 的CHAR_LENGTH,而 Oracle 的
LENGTHB≈ MySQL 的LENGTH------ 这是跨数据库开发时的常见陷阱!
五、典型应用场景
场景 1:检查字段是否超长(按字节)
sql
-- 检查姓名是否超过 VARCHAR2(10 BYTE) 的限制
SELECT name
FROM employees
WHERE LENGTHB(name) > 10;
场景 2:统计用户输入的字符数(不管中英文)
sql
-- 显示用户昵称的实际字符长度(用于 UI 显示)
SELECT nickname, LENGTH(nickname) AS display_length
FROM users;
✅ 总结
| 问题 | 答案 |
|---|---|
LENGTH 返回什么? |
字符个数(如"你好" → 2) |
LENGTHB 返回什么? |
字节长度(如"你好" → 6,在 AL32UTF8 下) |
| 哪个受字符集影响? | LENGTHB 受影响,LENGTH 不受影响 |
| 存储限制用哪个判断? | 用 LENGTHB(因为 VARCHAR2(N) 默认是 N 字节!) |
🔑 关键记忆点 :
在 Oracle 中,定义长度默认按字节,计算长度要分清
LENGTH(字符) vsLENGTHB(字节) 。若字段定义为
VARCHAR2(100),插入前应检查LENGTHB(value) <= 100,而非LENGTH(value) <= 100!