首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 判斷欄位是否包含中文的兩種高效方法

     編輯:MySQL 資料庫相關知識

資料清洗與驗證場景常需識別欄位是否包含中文字符。本文介紹兩種高效方法:正則表達式與長度比對法,並附實測對比。

方法一:正則表達式 REGEXP

Unicode 中文範圍大約在 [\u4e00-\u9fff] (CJK 統一表意文字基本區) 或更寬的 [\u3400-\u9fff]。

SELECT id, id REGEXP '[\\u4e00-\\u9fff]' AS has_chinese FROM t1;

方法二:LENGTH vs CHAR_LENGTH 比對

  • LENGTH(str):返回位元組長度
  • CHAR_LENGTH(str):返回字符數
  • UTF-8 編碼下,中文字符佔 3 位元組,英文數字佔 1 位元組
  • 判斷邏輯: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               |
+---------+------------+-----------------+-----------------+

效能與適用場景對比

維度REGEXPLENGTH 比對
可讀性語意明確需理解編碼原理
效能正則引擎開銷較大極快,純數值運算
準確度可精確控制字符範圍檢測所有多位元組字符(含日文、韓文、Emoji)
適用場景需精確識別中文快速篩選含非 ASCII 字符的資料

進階:精確識別中文且排除其他多位元組字符

-- 結合兩種方法:先快速篩選多位元組,再正則確認中文
SELECT * FROM t1 
WHERE LENGTH(id) > CHAR_LENGTH(id) 
  AND id REGEXP '[\\u4e00-\\u9fff]';

根據資料量與精確度需求選擇:百萬級以上資料建議長度比對法配合索引優化;精確識別中文場景使用 REGEXP 或混合策略。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved