MySQL LENGTH(str) 返回字串的 字節長度(非字符數),在資料清洗、異常值發現、批量更新中極具實戰價值。本文涵蓋基本用法、字符集陷阱、進階查詢模式、批量更新三大實戰場景。
SELECT LENGTH(column_name) FROM table_name;
| 字符集 | 英文/數字 | 中文/日文/韓文 | Emoji/生僻字 |
|---|---|---|---|
| latin1 | 1 字節 | ❌ 不支援 | ❌ |
| gbk | 1 字節 | 2 字節 | ❌ |
| utf8mb3 | 1 字節 | 3 字節 | ❌ |
| utf8mb4 | 1 字節 | 3 字節 | 4 字節 |
關鍵結論:LENGTH() 返回 字節數。若需字符數,請用 CHAR_LENGTH() 或 CHARACTER_LENGTH()。
avatar 應存 URL,但誤存了 11 位數字 ID-- 1. 定位異常記錄
SELECT * FROM broker_info WHERE LENGTH(avatar) = 11;
-- 2. 批量修正 cityid
UPDATE broker_info SET cityid = 2 WHERE LENGTH(avatar) = 11;
-- 3. 字段間數據遷移:將異常 avatar 值轉存至 mobile
UPDATE broker_info SET `mobile` = `avatar` WHERE LENGTH(avatar) = 11;
此模式適用於:
✅ 手機號長度驗證(LENGTH(mobile) != 11)
✅ 身份證號長度檢查(LENGTH(id_card) NOT IN (15,18))
✅ 郵編、訂單號等固定長度業務欄位的質量巡檢
-- 統計各表 VARCHAR 欄位的實際最大長度,評估是否可縮減定義長度
SELECT
TABLE_NAME, COLUMN_NAME,
MAX(LENGTH(COLUMN_NAME)) AS 實際最大字節長,
CHARACTER_MAXIMUM_LENGTH AS 定義最大字符長
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'your_db' AND DATA_TYPE = 'varchar'
GROUP BY TABLE_NAME, COLUMN_NAME;
-- 估算 TEXT/BLOB 實際佔用空間
SELECT
SUM(LENGTH(content)) / 1024 / 1024 AS 總計_MB,
AVG(LENGTH(content)) AS 平均字節數
FROM articles;
結合 COMPRESS() / UNCOMPRESS() 可評估壓縮收益:
SELECT
SUM(LENGTH(content)) AS 原始大小,
SUM(LENGTH(COMPRESS(content))) AS 壓縮後大小,
ROUND(SUM(LENGTH(COMPRESS(content))) / SUM(LENGTH(content)) * 100, 2) AS 壓縮率
FROM articles;
-- ❌ 導致全表掃描:函數包裹欄位
SELECT * FROM users WHERE LENGTH(name) > 10;
-- ✅ 改寫利用索引(若 name 有索引)
SELECT * FROM users WHERE name > '__________'; -- 10 個下劃線,利用字典序
-- 或建立函數索引(MySQL 8.0.13+)
ALTER TABLE users ADD INDEX idx_name_len ((LENGTH(name)));
| 函數 | 返回值 | 適用場景 |
|---|---|---|
| LENGTH(str) | 字節數 | 存儲空間計算、網絡傳輸大小、二進制數據處理 |
| CHAR_LENGTH(str) | 字符數 | 業務邏輯長度校驗、顯示截斷、多語言文本處理 |
| BIT_LENGTH(str) | 位數 | 底層存儲分析、位運算場景 |
CHAR_LENGTH(),存儲分析用 LENGTH()。SELECT 驗證影響行數,防止誤傷。LENGTH(json_col) > 1000000 觸發告警)。WHERE LENGTH(col) = N 無法使用普通索引,大表需建函數索引或冗餘長度欄位。VARCHAR(實際最大字符數 * 字符集最大字節數) 預留空間,避免頻繁 ALTER TABLE。LENGTH() 看似簡單,實則是洞察資料質量、優化存儲成本、發現業務異常的「顯微鏡」。善用它,能讓你的資料庫更乾淨、更高效。