萬盛學電腦網

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

MySQL 字串函數詳解:LENGTH、RIGHT、CHAR_LENGTH 用法與差異

概述

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

RIGHT(str, len) 函數

返回字串最右側 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)

CHAR_LENGTH 實戰:篩選長名稱

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 皆按字符運作,安全處理多語言資料
copyright © 萬盛學電腦網 all rights reserved