萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL LENGTH() 函數全攻略:字符長度計算、查詢過濾與批量更新實戰

LENGTH():不只是「算長度」,更是資料清洗的利器

MySQL LENGTH(str) 返回字串的 字節長度(非字符數),在資料清洗、異常值發現、批量更新中極具實戰價值。本文涵蓋基本用法、字符集陷阱、進階查詢模式、批量更新三大實戰場景。

一、核心語法與字符集陷阱

SELECT LENGTH(column_name) FROM table_name;
字符集英文/數字中文/日文/韓文Emoji/生僻字
latin11 字節❌ 不支援❌
gbk1 字節2 字節❌
utf8mb31 字節3 字節❌
utf8mb41 字節3 字節4 字節

關鍵結論:LENGTH() 返回 字節數。若需字符數,請用 CHAR_LENGTH() 或 CHARACTER_LENGTH()。

二、實戰場景 1:異常資料發現與清洗

案例:頭像欄位 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))
✅ 郵編、訂單號等固定長度業務欄位的質量巡檢

三、實戰場景 2:動態 SQL 生成與元數據分析

-- 統計各表 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;

四、實戰場景 3:存儲空間估算與壓縮決策

-- 估算 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;

五、進階技巧:LENGTH() 在 WHERE 條件中的索引陷阱

-- ❌ 導致全表掃描:函數包裹欄位
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 vs CHAR_LENGTH vs BIT_LENGTH

函數返回值適用場景
LENGTH(str)字節數存儲空間計算、網絡傳輸大小、二進制數據處理
CHAR_LENGTH(str)字符數業務邏輯長度校驗、顯示截斷、多語言文本處理
BIT_LENGTH(str)位數底層存儲分析、位運算場景

七、最佳實踐清單

  • ✅ 業務長度校驗用 CHAR_LENGTH(),存儲分析用 LENGTH()。
  • ✅ 批量更新前先 SELECT 驗證影響行數,防止誤傷。
  • ✅ 異常長度閾值寫入監控告警(如 LENGTH(json_col) > 1000000 觸發告警)。
  • ⚠️ WHERE LENGTH(col) = N 無法使用普通索引,大表需建函數索引或冗餘長度欄位。
  • 📝 表結構設計時,用 VARCHAR(實際最大字符數 * 字符集最大字節數) 預留空間,避免頻繁 ALTER TABLE。

LENGTH() 看似簡單,實則是洞察資料質量、優化存儲成本、發現業務異常的「顯微鏡」。善用它,能讓你的資料庫更乾淨、更高效。

copyright © 萬盛學電腦網 all rights reserved