MySQL 提供兩個字符串長度函數:LENGTH() 返回字節數,CHAR_LENGTH()(同 CHARACTER_LENGTH())返回字符數。在多字節字符集(utf8mb4、gbk)下,兩者差異巨大,誤用會導致截斷、校驗、排序邏輯錯誤。
| 函數 | 統計單位 | 英文/數字 | 中文(utf8mb4) | 中文(gbk) | Emoji (😀) |
|---|---|---|---|---|---|
| LENGTH() | 字節 | 1 | 3~4 | 2 | 4 |
| CHAR_LENGTH() | 字符 | 1 | 1 | 1 | 1 |
-- 要求用戶名 6~20 字符
SELECT * FROM `user` WHERE CHAR_LENGTH(`username`) BETWEEN 6 AND 20;
-- 估算表數據大小
SELECT
SUM(LENGTH(`title`)) AS title_bytes,
SUM(LENGTH(`content`)) AS content_bytes
FROM `article`;
-- 取前 100 字符作摘要
SELECT LEFT(`content`, 100) AS summary FROM `article`;
-- 若需按字節截取(如導出固定寬度文件)
SELECT LEFT(`content`, 200) AS summary_bytes FROM `article`; -- 視編碼調整
-- 按字符數排序(業務語義)
SELECT id, title FROM article ORDER BY CHAR_LENGTH(title) DESC LIMIT 10;
-- 按字節數排序(存儲分析)
SELECT id, title FROM article ORDER BY LENGTH(title) DESC LIMIT 10;
VARCHAR(100) 允許 100 個字符,實際字節上限取決於字符集(utf8mb4 為 400 字節)。IFNULL 或 COALESCE 處理。CHAR_LENGTH 同樣返回字符數,但字符定義為字節,等同於 LENGTH。SET @str = '中文abc😀';
SELECT
@str AS original,
LENGTH(@str) AS byte_len,
CHAR_LENGTH(@str) AS char_len,
HEX(@str) AS hex_bytes;
輸出將直觀展示每類字符的字節佔用,建議收藏備查。