LENGTH() / LEN() 函數 (SQL String Length Function)

LENGTH() 函數用於取得字串的長度 (字元數)。不同的資料庫使用不同的函數名稱。

各資料庫的函數名稱

資料庫函數名稱說明
MySQLLENGTH()返回位元組數
MySQLCHAR_LENGTH()返回字元數 (推薦用於多位元組字元)
SQL ServerLEN()返回字元數 (不含尾隨空格)
SQL ServerDATALENGTH()返回位元組數
PostgreSQLLENGTH()返回字元數
OracleLENGTH()返回字元數
SQLiteLENGTH()返回字元數

LENGTH() / LEN() 語法 (Syntax)

-- MySQL
SELECT LENGTH(column_name) FROM table_name;
SELECT CHAR_LENGTH(column_name) FROM table_name;

-- SQL Server
SELECT LEN(column_name) FROM table_name;

用法範例 (Example)

customers 資料表:

C_IdName
1Smith
2Brad

範例 1:取得字串長度

MySQL:

SELECT Name, LENGTH(Name) AS NameLength
FROM customers;

SQL Server:

SELECT Name, LEN(Name) AS NameLength
FROM customers;

結果:

NameNameLength
Smith5
Brad4

範例 2:MySQL LENGTH() vs CHAR_LENGTH()

對於多位元組字元 (如中文),LENGTH()CHAR_LENGTH() 的結果不同:

SELECT
    LENGTH('Hello') AS EnglishBytes,      -- 5 (每個字母 1 byte)
    CHAR_LENGTH('Hello') AS EnglishChars, -- 5
    LENGTH('你好') AS ChineseBytes,        -- 6 (UTF-8 中文每字 3 bytes)
    CHAR_LENGTH('你好') AS ChineseChars;   -- 2

💡 建議: 在 MySQL 中處理多國語言時,使用 CHAR_LENGTH() 來取得正確的字元數。

範例 3:SQL Server LEN() 與空格

LEN() 會自動去除尾隨空格:

SELECT
    LEN('Hello') AS WithoutSpaces,      -- 5
    LEN('Hello   ') AS WithTrailing,    -- 5 (尾隨空格被忽略)
    LEN('   Hello') AS WithLeading,     -- 8 (前導空格被計算)
    DATALENGTH('Hello   ') AS DataLen;  -- 8 (位元組數,包含空格)

實際應用範例

1. 篩選特定長度的資料

-- 找出名稱超過 10 個字元的客戶
SELECT * FROM customers
WHERE LENGTH(Name) > 10;

-- SQL Server
SELECT * FROM customers
WHERE LEN(Name) > 10;

2. 驗證資料格式

-- 檢查電話號碼長度
SELECT Phone,
       CASE
           WHEN LENGTH(Phone) = 10 THEN '有效'
           ELSE '無效'
       END AS Validation
FROM customers;

3. 資料清理

-- 找出可能有多餘空格的資料
SELECT Name
FROM customers
WHERE LENGTH(Name) != LENGTH(TRIM(Name));

4. 統計分析

-- 計算平均名稱長度
SELECT AVG(LENGTH(Name)) AS AvgNameLength
FROM customers;

-- 依長度分組統計
SELECT LENGTH(Name) AS NameLength, COUNT(*) AS Count
FROM customers
GROUP BY LENGTH(Name)
ORDER BY NameLength;

5. 截斷過長資料

SELECT
    CASE
        WHEN LENGTH(Description) > 50
        THEN CONCAT(LEFT(Description, 47), '...')
        ELSE Description
    END AS ShortDescription
FROM products;

與其他函數搭配使用

搭配 SUBSTRING()

-- 取得後 3 個字元
SELECT SUBSTRING(Name, LENGTH(Name) - 2, 3) AS LastThree
FROM customers;

搭配 RIGHT()

-- 取得副檔名
SELECT RIGHT(FileName, LENGTH(FileName) - INSTR(FileName, '.')) AS Extension
FROM files;

相關主題