利用 LENGTH() 與 CHAR_LENGTH()(或 CHARACTER_LENGTH())的差異,即可快速判斷欄位是否含有多位元組字符(如中文、日文、韓文、Emoji)。
LENGTH(str):回傳字串的位元組數。UTF-8 下一個中文佔 3 位元組(utf8mb4 下 4 位元組),英文/數字佔 1 位元組。CHAR_LENGTH(str):回傳字串的字符數,不管中英皆計為 1。若 LENGTH(col) = CHAR_LENGTH(col) → 純 ASCII(無中文);
若 LENGTH(col) > CHAR_LENGTH(col) → 含多位元組字符(有中文)。
SELECT *
FROM `t_ad`
WHERE `userid` = 974
AND `deleteflag` = 1
AND LENGTH(REPLACE(REPLACE(`title`, '-', ''), '+', ''))
> CHAR_LENGTH(REPLACE(REPLACE(`title`, '-', ''), '+', ''));
上面範例先移除 - 和 + 干擾字符,再比較兩個長度函數。
-- UTF-8 (3 bytes per Chinese char)
SELECT (LENGTH(col) - CHAR_LENGTH(col)) / 2 AS chinese_char_count
FROM `table`;
-- UTF8MB4 (4 bytes per Chinese char/Emoji)
SELECT (LENGTH(col) - CHAR_LENGTH(col)) / 3 AS chinese_char_count
FROM `table`;
CHAR_LENGTH 校驗。VARCHAR(100) 存中文最多 33 個字(utf8),需按字符數而非位元組數設計。