獲取字串長度是文本處理的基礎操作:驗證輸入長度、截斷顯示、計算儲存空間、解析定長格式。但各資料庫函數名、語義 (字符數 vs 字節數)、多位元組字符處理差異極大,本文系統梳理主流資料庫的長度函數,並給出字符集感知的最佳實踐。
| 資料庫 | 函數名 | 語義 | 返回類型 | 多位元組字符 (UTF-8 中文等) |
|---|---|---|---|---|
| MySQL / MariaDB | LENGTH(str) | 字節數 | INTEGER | 中文佔 3 字節 (utf8mb4) |
| MySQL / MariaDB | CHAR_LENGTH(str) / CHARACTER_LENGTH(str) | 字符數 | INTEGER | 中文佔 1 字符 |
| PostgreSQL | LENGTH(str) / CHAR_LENGTH(str) | 字符數 | INTEGER | 正確計算字符數 |
| SQL Server | LEN(str) | 字符數 (忽略尾部空格) | INT | 正確計算字符數 |
| SQL Server | DATALENGTH(str) | 字節數 | INT/BIGINT | 含尾部空格 |
| Oracle | LENGTH(str) / LENGTHB(str) / LENGTHC(str) | 字符數 / 字節數 / Unicode 代碼點數 | NUMBER | 正確區分 |
| SQLite | LENGTH(str) | 字節數 | INTEGER | UTF-8 字節數 |
SET NAMES utf8mb4;
SELECT
LENGTH('菜鳥教程') AS len_bytes, -- 12 (4字符 × 3字節)
CHAR_LENGTH('菜鳥教程') AS len_chars; -- 4
LENGTH:底層字節長度,utf8mb4 下中文 3 字節、Emoji 4 字節。CHAR_LENGTH:邏輯字符數,與字符集無關,業務邏輯 (驗證長度、截取) 應用 CHAR_LENGTH。BIT_LENGTH:位數 (字節數 × 8)。SELECT
LEN('abc') AS l1, -- 3
LEN('abc ') AS l2, -- 3 (尾部空格被忽略!)
DATALENGTH('abc') AS d1, -- 3
DATALENGTH('abc ') AS d2; -- 4
DATALENGTH (字節) 或 LEN(RTRIM(str)) 邏輯處理。SELECT
LENGTH('菜鳥') AS l1, -- 2 字符
LENGTHB('菜鳥') AS l2, -- 字節數 (視字符集 AL32UTF8=6, ZHS16GBK=4)
LENGTHC('菜鳥') AS l3 -- Unicode 代碼點數 (通常=字符數)
FROM dual;
SELECT
LENGTH('菜鳥教程') AS l1, -- 4
CHAR_LENGTH('菜鳥教程') AS l2; -- 4 (同義)
LENGTH 直接返回字符數,無字節/字符混淆。+----+--------------+---------------------------+-------+---------+ | id | name | url | alexa | country | +----+--------------+---------------------------+-------+---------+ | 1 | Google | https://www.google.cm/ | 1 | USA | | 2 | 淘寶 | https://www.taobao.com/ | 13 | CN | | 3 | 菜鳥教程 | https://www.runoob.com/ | 4689 | CN | | 4 | 微博 | https://weibo.com/ | 20 | CN | | 5 | Facebook | https://www.facebook.com/ | 3 | USA | | 7 | stackoverflow| https://stackoverflow.com/ | 0 | IND | +----+--------------+---------------------------+-------+---------+
SELECT name, LENGTH(url) AS LengthOfURL FROM Websites;

WHERE CHAR_LENGTH(password) BETWEEN 8 AND 64 (MySQL) / WHERE LENGTH(password) BETWEEN 8 AND 64 (PG/SQL Server)。SUBSTRING(raw, 1, 10) 需精確位置,MySQL 用 CHAR_LENGTH 校驗、SQL Server 用 DATALENGTH 校驗。SELECT SUM(LENGTH(col)) FROM tbl 估算列實際佔用字節 (MySQL/SQLite/Oracle LENGTHB)。VARCHAR(255) 索引前綴長度按字節,CHAR_LENGTH 不直接相關。LENGTH/CHAR_LENGTH 為確定性標量函數,可用於索引表達式 (MySQL 8.0+ 函數索引、PG 表達式索引、SQL Server 計算欄索引)。utf8 (3字節) vs utf8mb4 (4字節 Emoji),CHAR_LENGTH 不受影響。字串長度函數看似微不足道,實則是字符集感知、跨平台遷移、定長解析的高發錯誤區。牢記「MySQL 用 CHAR_LENGTH、SQL Server 警惕 LEN、Oracle 分場景用 LENGTH/LENGTHB、PG 統一 LENGTH」,並在架構層封裝統一介面,讓長度計算精準、可移植、無驚喜。