在 MySQL 中處理字串長度時,LENGTH() 與 CHAR_LENGTH()(或 CHARACTER_LENGTH())是兩個最常被混淆的函數。它們的根本區別在於計算單位:
需求:查詢用戶名長度恰好為 3 個英文字元的記錄(排除 3 個漢字的情況)。
SELECT * FROM `user` WHERE LENGTH(`username`) = 3;
此時 abc 會被選中,但 張三(UTF-8 下 6 位元組)不會。
需求:找出佔用 3 個字元位置的欄位,不分中英。
SELECT * FROM `user` WHERE CHAR_LENGTH(`username`) = 3;
abc、張三李、a1中 皆會被選中。
LENGTH() 的結果取決於資料庫/表/欄位的字元集設定。若使用 utf8mb4,一個漢字佔 4 位元組;若為 gbk,則佔 2 位元組。因此跨字元集環境時,務必使用 CHAR_LENGTH() 進行邏輯判斷,避免因編碼變更導致業務邏輯錯誤。
SELECT
'測試' AS str,
LENGTH('測試') AS byte_len,
CHAR_LENGTH('測試') AS char_len;
結果(UTF-8 環境):
| str | byte_len | char_len |
|---|---|---|
| 測試 | 6 | 2 |