資料清洗與驗證場景常需識別欄位是否包含中文字符。本文介紹兩種高效方法:正則表達式與長度比對法,並附實測對比。
Unicode 中文範圍大約在 [\u4e00-\u9fff] (CJK 統一表意文字基本區) 或更寬的 [\u3400-\u9fff]。
SELECT id, id REGEXP '[\\u4e00-\\u9fff]' AS has_chinese FROM t1;
LENGTH(str):返回位元組長度CHAR_LENGTH(str):返回字符數LENGTH(str) > CHAR_LENGTH(str) → 包含多位元組字符(中文等)DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (id VARCHAR(200)) DEFAULT CHARSET=utf8;
INSERT INTO t1 VALUES ('中文'), ('sdalfkj');
-- 方法一:REGEXP
SELECT id, id REGEXP '[\\u4e00-\\u9fff]' AS has_chinese FROM t1;
+---------+---------------+
| id | has_chinese |
+---------+---------------+
| 中文 | 1 |
| sdalfkj | 0 |
+---------+---------------+
-- 方法二:長度比對
SELECT id, LENGTH(id), CHAR_LENGTH(id),
(LENGTH(id) > CHAR_LENGTH(id)) AS has_multibyte FROM t1;
+---------+------------+-----------------+-----------------+
| id | LENGTH(id) | CHAR_LENGTH(id) | has_multibyte |
+---------+------------+-----------------+-----------------+
| 中文 | 6 | 2 | 1 |
| sdalfkj | 7 | 7 | 0 |
+---------+------------+-----------------+-----------------+
| 維度 | REGEXP | LENGTH 比對 |
|---|---|---|
| 可讀性 | 語意明確 | 需理解編碼原理 |
| 效能 | 正則引擎開銷較大 | 極快,純數值運算 |
| 準確度 | 可精確控制字符範圍 | 檢測所有多位元組字符(含日文、韓文、Emoji) |
| 適用場景 | 需精確識別中文 | 快速篩選含非 ASCII 字符的資料 |
-- 結合兩種方法:先快速篩選多位元組,再正則確認中文
SELECT * FROM t1
WHERE LENGTH(id) > CHAR_LENGTH(id)
AND id REGEXP '[\\u4e00-\\u9fff]';
根據資料量與精確度需求選擇:百萬級以上資料建議長度比對法配合索引優化;精確識別中文場景使用 REGEXP 或混合策略。