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

MySQL REPLACE 與 REGEXP 完全指南:字符串替換、正則匹配與中文模糊查詢優化

     編輯:MySQL 資料庫相關知識

MySQL 提供 REPLACE 字符串替換函數與 REGEXP 正則表達式匹配,是數據清洗、模糊搜索、文本處理的利器。本文系統整理語法、實戰案例、中文編碼陷阱與性能優化建議。

一、REPLACE 相關用法

1. REPLACE INTO(插入或替換行)

REPLACE INTO table (id, name) VALUES ('1', 'aa'), ('2', 'bb');

邏輯:若主鍵/唯一鍵衝突 → 刪除舊行 → 插入新行。等效於 DELETE + INSERT。

⚠ 需表有主鍵或唯一索引,否則退化為普通 INSERT。

2. REPLACE(str, from_str, to_str)(字符串替換函數)

SELECT REPLACE('www.163.com', 'w', 'Ww');  -- 返回 'WwWwWw.163.com'

-- 批量更新表字段
UPDATE `table` SET `name` = REPLACE(`name`, 'aa', 'bb');

將字段中所有 aa 替換為 bb,區分大小寫。

二、REGEXP 正則表達式完整語法

元字符速查表

符號含義示例匹配
^字符串開始'^abc' 匹配以 abc 開頭
$字符串結束'xyz$' 匹配以 xyz 結尾
.任意單字符(含換行)'a.c' 匹配 abc、axc
[...]字符類,任一字符'[abc]' 匹配 a/b/c
[^...]排除字符類'[^0-9]' 匹配非數字
*前字符 0 次或多次'ab*c' 匹配 ac、abc、abbc
+前字符 1 次或多次'ab+c' 匹配 abc、abbc
?前字符 0 次或 1 次'ab?c' 匹配 ac、abc
{n}前字符恰好 n 次'a{3}' 匹配 aaa
{n,}前字符至少 n 次'a{2,}' 匹配 aa、aaa...
{n,m}前字符 n 到 m 次'a{2,4}' 匹配 aa、aaa、aaaa
|或關係'cat|dog' 匹配 cat 或 dog
(...)分組'(ab)+' 匹配 ab、abab

字符類快捷方式

語法等價於說明
[:alnum:][A-Za-z0-9]字母數字
[:alpha:][A-Za-z]字母
[:digit:][0-9]數字
[:lower:][a-z]小寫字母
[:upper:][A-Z]大寫字母
[:space:][ \t\r\n\v\f]空白字符
[:punct:]標點符號
[:xdigit:][0-9A-Fa-f]十六進制

單詞邊界

  • [[:<:]]:單詞開頭
  • [[:>:]]:單詞結尾
SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]';  -- 1 (匹配)
SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]'; -- 0 (不匹配)

實戰查詢案例

-- 以 b 開頭
SELECT * FROM pet WHERE name REGEXP '^b';

-- 以 fy 結尾
SELECT * FROM pet WHERE name REGEXP 'fy$';

-- 包含 w
SELECT * FROM pet WHERE name REGEXP 'w';

-- 精確 5 字符
SELECT * FROM pet WHERE name REGEXP '^.....$';
-- 或
SELECT * FROM pet WHERE name REGEXP '^.{5}$';

三、中文 LIKE 模糊查詢亂碼/誤匹配問題

現象

SELECT * FROM contact WHERE name LIKE '%a%';
-- 結果竟包含中文「新」!

根因

MySQL 默認字符集 latin1/utf8 且 不區分大小寫,中文 UTF-8 編碼中某些字節恰好落在 ASCII 字母範圍,導致大小寫轉換邏輯誤判。

解決方案對比

方案SQL 示例優點缺點
字段加 BINARYname CHAR(10) BINARY表級生效,無需改 SQL區分大小寫,插入也受影響
編譯指定 charset=gbk./configure --with-charset=gbk原生支持中文排序需重編譯,遷移麻煩
LOCATE 函數WHERE LOCATE('a', name) > 0不改表結構同樣不區分大小寫
LIKE BINARYWHERE name LIKE BINARY '%a%'單次查詢生效區分大小寫
UCASE/BINARY 組合(推薦)WHERE BINARY UCASE(name) LIKE UCASE('%a%')不區分大小寫、正確匹配中文略慢(函數導致全表掃描)

最佳實踐

-- 不區分大小寫、正確處理中文
SELECT id, title FROM news 
WHERE BINARY UCASE(title) LIKE CONCAT('%', UCASE('搜索詞'), '%');

四、REGEXP 特殊字符轉義

正則中使用字面量特殊字符需雙反斜杠:

SELECT '1+2' REGEXP '1\\+2';  -- 1 (匹配)
SELECT '1+2' REGEXP '1+2';    -- 0 (+ 被視為元字符)
SELECT '1+2' REGEXP '1\+2';   -- 0 (單反斜杠被 SQL 消費)

五、性能優化建議

  1. 避免前導通配符:LIKE '%abc' / REGEXP 'abc' 導致全表掃描
  2. 優先用 LIKE 前綴:LIKE 'abc%' 可用索引
  3. 全文搜索用 Fulltext 索引:大文本字段建 FULLTEXT,配合 MATCH...AGAINST
  4. REGEXP 不走索引:MySQL 8.0 前 REGEXP 完全不使用索引,慎用於大表
  5. 應用層預處理:複雜文本分析考慮 Elasticsearch

總結:REPLACE 適合精確替換;REGEXP 功能強但性能弱;中文模糊查詢用 BINARY UCASE(...) 組合;大規模搜索上專業搜索引擎。

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