2013-11-04 67 views
6

我想通過REGEXMySQL數據庫獲取數據,有或沒有特殊的utf-8字符。mysql正則表達式utf-8字符

讓我上個例子來說:

如果用戶輸入的字像sirena它應該返回行,其中包括像sirenasirénašíreňá ..等.. 也應該倒退,當他進入siréná工作字它應該返回相同的結果..

我試圖通過REGEX尋找它,我的查詢看起來是這樣的:

SELECT * FROM `content` WHERE `text` REGEXP '[sšŠ][iíÍ][rŕŔřŘ][eéÉěĚ][nňŇ][AaáÁäÄ0]' 

它的工作原理只有在數據庫字sirena而不是當有字siréňa ..

是因爲一些與UTF-8和MySQL? (mysql列的排序規則是utf8_general_ci

謝謝!

回答

5

MySQL的正則表達式庫不支持utf-8。

請參閱Bug #30241 Regular expression problems,它自2007年以來一直開放。它們將不得不更改它們在使用之前可以修復的正則表達式庫,並且我還沒有發現任何何時或是否會這樣做的通知。

我見過的唯一的解決方法是搜索特定的HEX字符串:

mysql> SELECT * FROM `content` WHERE HEX(`text`) REGEXP 'C3A9C588'; 
+----------+ 
| text  | 
+----------+ 
| siréňa | 
+----------+ 

回覆您的評論:

不,我不知道MySQL的任何解決方案。

您可能不得不切換到PostgreSQL,因爲該RDBMS支持regular expression syntax中的UTF字符代碼\u

+0

所以沒有辦法解決,如果我的字符串變量? – Maarty

+0

自從你回答這個問題以來已經過去了兩年。你知道關於這個話題的任何更新嗎? – emisilva

+0

@emisilva,點擊我提供的鏈接來檢查該錯誤的狀態。 –

0

試着像... REGEXP '(a|b|[ab])'

SELECT * FROM `content` WHERE `text` REGEXP '(s|š|Š|[sšŠ])(i|í|Í|[iíÍ])(r|ŕ|Ŕ|ř|Ř|[rŕŔřŘ])(e|é|É|ě|Ě|[eéÉěĚ])(n|ň|Ň|[nňŇ])(A|a|á|Á|ä|Ä|0|[AaáÁäÄ0])' 

這對我的作品!

-3

使用來自MySQL的UDF存儲庫PCRE正則表達式直接在MySQL中lib_mysqludf_preg庫

雖然MySQL的正則表達式庫不支持UTF-8 MySQL的UDF庫必須根據使用UTF-8兼容的正則表達式的能力PCRE正則表達式直接在mysql中。

http://www.mysqludf.org/ https://github.com/mysqludf/lib_mysqludf_preg#readme

+0

雖然這可能在理論上回答這個問題,但[這將是更可取的](// meta.stackoverflow.com/q/8259)在這裏包括答案的基本部分,並提供供參考的鏈接。 –

+0

儘管MySQL的正則表達式庫不支持utf-8,但mysql UDF存儲庫可以直接在mysql中根據PCRE正則表達式使用utf-8兼容正則表達式。 – Ghanshyam

+0

浪費了我的時間安裝這個庫,事實證明它根本不支持(意味着正確處理)utf-8。 SELECT PREG_RLIKE('/ aeiou /','àèìòù')返回0,就像SELECT'aeiou'RLIKE'àèìòù'一樣。所以,這個庫不能解決MySQL不能正確處理utf8的問題。 – matteo