LENGTH() / LEN() 函數 (SQL String Length Function)
LENGTH() 函數用於取得字串的長度 (字元數)。不同的資料庫使用不同的函數名稱。
各資料庫的函數名稱
| 資料庫 | 函數名稱 | 說明 |
|---|---|---|
| MySQL | LENGTH() | 返回位元組數 |
| MySQL | CHAR_LENGTH() | 返回字元數 (推薦用於多位元組字元) |
| SQL Server | LEN() | 返回字元數 (不含尾隨空格) |
| SQL Server | DATALENGTH() | 返回位元組數 |
| PostgreSQL | LENGTH() | 返回字元數 |
| Oracle | LENGTH() | 返回字元數 |
| SQLite | LENGTH() | 返回字元數 |
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_Id | Name |
|---|---|
| 1 | Smith |
| 2 | Brad |
範例 1:取得字串長度
MySQL:
SELECT Name, LENGTH(Name) AS NameLength
FROM customers;
SQL Server:
SELECT Name, LEN(Name) AS NameLength
FROM customers;
結果:
| Name | NameLength |
|---|---|
| Smith | 5 |
| Brad | 4 |
範例 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;
相關主題
- CONCAT() - 字串連接
- SUBSTRING() - 擷取子字串
- TRIM() - 去除空格
- LEFT() / RIGHT() - 取得左/右側字元