MySQL僅支持多數正則表達式實現的一個很小的子集。
----------------------
9.2.1 基本字符匹配
REGEXP後所跟的東西作為正則表達式處理。
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000'
ORDER BY prod_name;
------返回------
+------------------------+
| prod_name |
+------------------------+
| JetPack 1000 |
+------------------------+
. 表示匹配任意一個字符。
SELECT prod_name
FROM products
WHERE prod_name REGEXP '.000'
ORDER BY prod_name;
------------返回-----------
+-------------------------+
| prod_name |
+-------------------------+
| JetPack 1000 |
| JetPack 2000 |
+-------------------------+
MySQL中的正則表達式匹配不區分大小寫。
為區分大小寫,可使用BINARY關鍵字。
如:WHERE prod_name REGEXP BINARY 'JetPack .000'
9.2.2 進行OR匹配
為搜索兩個串之一(或者這個串,或者為另一個串),使用 | 。
| 作為OR操作符,表示匹配其中之一。可給出兩個以上的OR條件。
代碼
[ ] 匹配任何單一字符。
[123]定義一組字符,意思是匹配1或2或3.
[ ]是另外一種形式的OR語句,[123] Ton 就是 [1 | 2 | 3] Ton 的縮寫。
^ 否定一個字符集合,將匹配除指定字符外的任何東西。[^123]將匹配除這些字符外的任何東西。
代碼
匹配范圍
[0123456789] 或 [0-9] 將匹配數字0到9
[a-z] 匹配任意字母符號
代碼
匹配特殊字符
\\ 為前導。即轉義.正則表達式內具有特殊意義的所有字符都必須以這種方式轉義。
\\- 表示查找 -
\\. 表示查找 .
代碼
\\ 也用來引用元字符(具有特殊意義的字符)
\\f 換頁
\\n 換行
\\r 回車
\\t 制表
\\v 縱向制表
匹配字符類
代碼
匹配多個實例
代碼
以下例子:s後的?使s可選,因為?匹配它前面的任何字符的0次或1次出現。
代碼
匹配連在一直的4位數字:WHERE prod_name REGEXP '[[:digit:]]{4}'
定位符
^ 文本的開始
$ 文本的末尾
[[:<:]] 詞的開始
[[:>:]] 詞的結尾
代碼
^的雙重用途:在集合中(用[ ]定義),用它來否定該集合。否則,用來指串的開始和。
LIKE 匹配整個串,而REGEXP匹配子串。
簡單的正則表達式測試 可以在不使用數據庫的情況下用SELECT來測試正則表達式。
REGEXP檢查總是返回0(沒有匹配)或1(匹配),可以用帶文字串的REGEXP來測
試表達式,並試驗它們。相應的語法如下:
SELECT 'hello' REGEXP '[0-9]'
這個例子返回0(因為文本hello中沒有數字)。
下面看看like及正則的例子
我們在查詢某個字段的時候,有時候只想匹配某段數據,比如想查詢這篇文章的所有關鍵詞是否存在某個關鍵詞,我們往往需要匹配,我們下面來講解一下如何匹配查詢某個關鍵詞值
SQL模糊查詢的語法為
“SELECT column FROM table WHERE column LIKE ';pattern';”。
SQL提供了四種匹配模式:
1. % 表示任意0個或多個字符。如下語句:
SELECT * FROM user WHERE name LIKE ';%三%';
將會把name為“張三”,“三腳貓”,“唐三藏”等等有“三”的全找出來;
2. _ 表示任意單個字符。語句:
SELECT * FROM user WHERE name LIKE ';_三_';
只找出“唐三藏”這樣name為三個字且中間一個字是“三”的;
SELECT * FROM user WHERE name LIKE ';三__';
只找出“三腳貓”這樣name為三個字且第一個字是“三”的;
3. [ ] 表示括號內所列字符中的一個(類似與正則表達式)。語句:
SELECT * FROM user WHERE name LIKE ';[張李王]三';
將找出“張三”、“李三”、“王三”(而不是“張李王三”);
如 [ ] 內有一系列字符(01234、abcde之類的)則可略寫為“0-4”、“a-e”
SELECT * FROM user WHERE name LIKE ';老[1-9]';
將找出“老1”、“老2”、……、“老9”;
如要找“-”字符請將其放在首位:';張三[-1-9]';
4. [^ ] 表示不在括號所列之內的單個字符。語句:
SELECT * FROM user WHERE name LIKE ';[^張李王]三';
將找出不姓“張”、“李”、“王”的“趙三”、“孫三”等;
SELECT * FROM user WHERE name LIKE ';老[^1-4]';
將排除“老1”到“老4”尋找“老5”、“老6”、……、“老9”。
!最後是重點!
由於通配符的緣故,導致我們查詢特殊字符“%”、“_”、“[”、“';”的語句無法正常實現,而把特殊字符用“[ ]”括起便可正常查詢。據此我們寫出以下函數:
function sqlencode(str)
str=replace(str,"';","';';")
str=replace(str,"[","[[]") ';此句一定要在最先
str=replace(str,"_","[_]")
str=replace(str,"%","[%]")
sqlencode=str
end function