MySQL 提供多種字串長度計算與截取函數,理解它們在多位元組字符集(如 UTF-8)下的行為差異至關重要。本文詳細說明 LENGTH、CHAR_LENGTH、RIGHT 等函數的用法並給出實戰範例。
| 函數 | 別名 | 計算單位 | 說明 |
|---|---|---|---|
LENGTH(str) | OCTET_LENGTH(str) | 位元組 | 返回字串佔用的位元組數。UTF-8 下一個中文字佔 3 位元組。 |
CHAR_LENGTH(str) | CHARACTER_LENGTH(str) | 字符 | 返回字串的字符數,不管字符集,一個中文字算 1。 |
mysql> SELECT LENGTH('text'), OCTET_LENGTH('text');
+----------------+----------------------+
| LENGTH('text') | OCTET_LENGTH('text') |
+----------------+----------------------+
| 4 | 4 |
+----------------+----------------------+
mysql> SELECT LENGTH('中文'), CHAR_LENGTH('中文');
+----------------+---------------------+
| LENGTH('中文') | CHAR_LENGTH('中文') |
+----------------+---------------------+
| 6 | 2 |
+----------------+---------------------+
返回字串最右側 len 個字符。支援多位元組字符,按字符而非位元組截取。
mysql> SELECT RIGHT('foobarbar', 4);
+-----------------------+
| RIGHT('foobarbar', 4) |
+-----------------------+
| rbar |
+-----------------------+
mysql> SELECT RIGHT('你好世界', 2);
+------------------------+
| RIGHT('你好世界', 2) |
+------------------------+
| 世界 |
+------------------------+
將「FirstName LastName」轉為「LastName, FirstName」並按新格式排序:
-- 建表與測試資料
CREATE TABLE Student (
StudentID INT NOT NULL PRIMARY KEY,
Name VARCHAR(50) NOT NULL
) ENGINE=InnoDB;
INSERT INTO Student (StudentID, Name) VALUES
(1, 'Joe Wang'),
(2, 'Cory But'),
(3, 'JJ Harvests');
-- 查詢:取空格後的部分(姓)+ 逗號 + 空格前的部分(名)
SELECT
CONCAT(
RIGHT(Name, LENGTH(Name) - INSTR(Name, ' ')),
', ',
LEFT(Name, INSTR(Name, ' ') - 1)
) AS StudentName
FROM Student
ORDER BY StudentName;
-- 結果
+---------------+
| StudentName |
+---------------+
| But, Cory |
| Harvests, JJ |
| Wang, Joe |
+---------------+
解析:
INSTR(Name, ' ') 找到第一個空格位置LEFT(Name, pos-1) 取名RIGHT(Name, LENGTH(Name)-pos) 取姓(此處用 LENGTH 亦可,因純 ASCII)SELECT Name, CHAR_LENGTH(Name) AS CharLength
FROM DVDs
WHERE CHAR_LENGTH(Name) > 5
ORDER BY Name;
此處必須用 CHAR_LENGTH,否則 UTF-8 環境下中文標題會被誤判長度。
LENGTH(位元組)CHAR_LENGTH(字符)RIGHT/LEFT/SUBSTRING 皆按字符運作,安全處理多語言資料