首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> SQL 基礎

SQL LEN()/LENGTH() 函數完全指南:字串長度計算、字符 vs 字節、跨資料庫差異與效能

     編輯:SQL 基礎

SQL LEN()/LENGTH() 函數完全指南:字串長度計算、字符 vs 字節、跨資料庫差異與效能

獲取字串長度是文本處理的基礎操作:驗證輸入長度、截斷顯示、計算儲存空間、解析定長格式。但各資料庫函數名、語義 (字符數 vs 字節數)、多位元組字符處理差異極大,本文系統梳理主流資料庫的長度函數,並給出字符集感知的最佳實踐。

主流資料庫長度函數對比

資料庫 函數名 語義 返回類型 多位元組字符 (UTF-8 中文等)
MySQL / MariaDBLENGTH(str)字節數INTEGER中文佔 3 字節 (utf8mb4)
MySQL / MariaDBCHAR_LENGTH(str) / CHARACTER_LENGTH(str)字符數INTEGER中文佔 1 字符
PostgreSQLLENGTH(str) / CHAR_LENGTH(str)字符數INTEGER正確計算字符數
SQL ServerLEN(str)字符數 (忽略尾部空格)INT正確計算字符數
SQL ServerDATALENGTH(str)字節數INT/BIGINT含尾部空格
OracleLENGTH(str) / LENGTHB(str) / LENGTHC(str)字符數 / 字節數 / Unicode 代碼點數NUMBER正確區分
SQLiteLENGTH(str)字節數INTEGERUTF-8 字節數

關鍵差異深度解析

MySQL:LENGTH vs CHAR_LENGTH

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)。

SQL Server:LEN 陷阱 — 忽略尾部空格

SELECT 
    LEN('abc')        AS l1,   -- 3
    LEN('abc ')       AS l2,   -- 3 (尾部空格被忽略!)
    DATALENGTH('abc') AS d1,   -- 3
    DATALENGTH('abc ') AS d2;   -- 4
  • LEN 不計算尾部空格,這違反直覺,導致定長解析、填充驗證 Bug。
  • 需精確長度用 DATALENGTH (字節) 或 LEN(RTRIM(str)) 邏輯處理。

Oracle:三大長度函數

SELECT 
    LENGTH('菜鳥')    AS l1,  -- 2 字符
    LENGTHB('菜鳥')   AS l2,  -- 字節數 (視字符集 AL32UTF8=6, ZHS16GBK=4)
    LENGTHC('菜鳥')   AS l3   -- Unicode 代碼點數 (通常=字符數)
FROM dual;

PostgreSQL:統一字符語義

SELECT 
    LENGTH('菜鳥教程')      AS l1,  -- 4
    CHAR_LENGTH('菜鳥教程') AS l2;  -- 4 (同義)
  • 內部 UTF-8 存儲,LENGTH 直接返回字符數,無字節/字符混淆。

演示資料庫:Websites 表

+----+--------------+---------------------------+-------+---------+
| 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     |
+----+--------------+---------------------------+-------+---------+

範例:查詢網站名與 URL 字節長度

SELECT name, LENGTH(url) AS LengthOfURL
FROM Websites;

SQL LENGTH 範例輸出

實戰應用場景

  1. 輸入驗證:WHERE CHAR_LENGTH(password) BETWEEN 8 AND 64 (MySQL) / WHERE LENGTH(password) BETWEEN 8 AND 64 (PG/SQL Server)。
  2. 定長解析:SUBSTRING(raw, 1, 10) 需精確位置,MySQL 用 CHAR_LENGTH 校驗、SQL Server 用 DATALENGTH 校驗。
  3. 儲存空間估算:SELECT SUM(LENGTH(col)) FROM tbl 估算列實際佔用字節 (MySQL/SQLite/Oracle LENGTHB)。
  4. 索引長度限制:MySQL VARCHAR(255) 索引前綴長度按字節,CHAR_LENGTH 不直接相關。

效能考量

  • LENGTH/CHAR_LENGTH 為確定性標量函數,可用於索引表達式 (MySQL 8.0+ 函數索引、PG 表達式索引、SQL Server 計算欄索引)。
  • 大量行調用開銷極低 (CPU 級),但避免在 WHERE 對大表全掃描調用,改用生成欄/計算欄 + 索引。

避坑清單

  1. MySQL 業務長度驗證用 CHAR_LENGTH,不用 LENGTH。
  2. SQL Server LEN 忽略尾部空格,定長場景用 DATALENGTH。
  3. 跨資料庫遷移必測多位元組字符:中文、Emoji、混合字串驗證長度邏輯一致。
  4. 字符集變更影響 LENGTH:MySQL utf8 (3字節) vs utf8mb4 (4字節 Emoji),CHAR_LENGTH 不受影響。

字串長度函數看似微不足道,實則是字符集感知、跨平台遷移、定長解析的高發錯誤區。牢記「MySQL 用 CHAR_LENGTH、SQL Server 警惕 LEN、Oracle 分場景用 LENGTH/LENGTHB、PG 統一 LENGTH」,並在架構層封裝統一介面,讓長度計算精準、可移植、無驚喜。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved