簡體   English   中英

MySQL REGEXP查詢 - 重音不敏感搜索

[英]MySQL REGEXP query - accent insensitive search

我正在尋找一個葡萄酒名稱的數據庫,其中許多包含重音(但不是統一的方式,所以類似的葡萄酒可以輸入或不加重音)

基本查詢如下所示:

SELECT * FROM `table` WHERE `wine_name` REGEXP '[[:<:]]Faugères[[:>:]]'

這將返回標題中帶有'Faugères'的條目,但不會返回'Faugeres'

SELECT * FROM `table` WHERE `wine_name` REGEXP '[[:<:]]Faugeres[[:>:]]'

反其道而行之。

我原以為:

SELECT * 
FROM `table` 
WHERE `wine_name` REGEXP '[[:<:]]Faug[eèêéë]r[eèêéë]s[[:>:]]'

可能會做的伎倆,但這只返回沒有重音的結果。

該字段被整理為utf8_unicode_ci,從我讀過的內容是它應該如何。

有什么建議?!

你運氣不好

警告

REGEXP和RLIKE運算符以字節方式工作,因此它們不是多字節安全的,並且可能會產生多字節字符集的意外結果。 此外,這些運算符通過字節值比較字符,並且即使給定的排序規則將重音字符視為相等,重音字符也可能無法比較。

[[:<:]][[:>:]]表達式運算符是字邊界的標記。 使用LIKE運算符可以實現的最接近的就是這一行:

SELECT *
FROM `table`
WHERE wine_name = 'Faugères'
   OR wine_name LIKE 'Faugères %'
   OR wine_name LIKE '% Faugères'

正如你所看到的那樣,它並不完全等價,因為我已經將字邊界的概念限制在空格中。 為其他邊界添加更多子句將是一團糟。

您也可以使用全文搜索(盡管它不相同)但您無法在InnoDB表中定義全文索引(尚未)。

你當然不幸:)


附錄:從MySQL 8.0開始,這已經改變了:

MySQL使用國際Unicode組件(ICU)實現正則表達式支持,ICU提供完整的Unicode支持並且是多字節安全的。 (在MySQL 8.0.4之前,MySQL使用Henry Spencer的正則表達式實現,它以字節方式運行,並且不是多字節安全的。

因為REGEXP和RLIKE是面向字節的,你試過:

SELECT 'Faugères' REGEXP 'Faug(e|è|ê|é|ë)r(e|è|ê|é|ë)s';

這說明其中一個必須在表達中。 請注意,我沒有使用加號(+),因為這意味着一個或多個。 既然你只想要一個,你不應該使用加號。

utf8_general_ci在排序時看到重音/沒有重音之間沒有區別。 也許這對搜索也是如此。 另外,將REGEXP更改為LIKE。 REGEXP進行二進制比較。

好的,我在搜索其他內容時偶然發現了這個問題。

這返回true。

SELECT 'Faugères' REGEXP 'Faug[eèêéë]+r[eèêéë]+s';

希望能幫助到你。

添加'+'告訴正則表達式查找一個或多個字符。

為了解決這個問題,我嘗試了不同的東西,包括使用二進制關鍵字或latin1字符集但無濟於事。
最后,考慮到它是一個MySql錯誤,我最終取代了é和èchars,

像這樣 :

SELECT * 
FROM `table` 
WHERE replace(replace(wine_name, 'é', 'e'), 'è', 'e') REGEXP '[[:<:]]Faugeres[[:>:]]'

我有同樣的問題試圖找到符合下列模式之一的每條記錄:'copropriété','copropriete','COPROPRIÉTÉ','Copropri?t?'

REGEXP 'copropri.{1,2}t.{1,2}為我工作。 基本上, .{1,2}將在每種情況下工作,字符是1或2字節編碼。

說明: https//dev.mysql.com/doc/refman/5.7/en/regexp.html

警告
REGEXP和RLIKE運算符以字節方式工作,因此它們不是多字節安全的,並且可能會產生多字節字符集的意外結果。 此外,這些運算符通過字節值比較字符,並且即使給定的排序規則將重音字符視為相等,重音字符也可能無法比較。

我有這個問題,並且去了Álvaro的建議。 但就我而言,它錯過了搜索詞是字符串中間詞的那些實例。 我去了相當於:

SELECT *
FROM `table`
WHERE wine_name = 'Faugères'
   OR wine_name LIKE 'Faugères %'
   OR wine_name LIKE '% Faugères'
   OR wine_name LIKE '% Faugères %'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM