2013-11-04 14 views
6

Sto cercando di ottenere dati dal database MySQL tramite REGEX con o senza caratteri speciali utf-8.mysql regex utf-8 caratteri

Mi spiego on esempio:

Se l'utente immette parola come sirena dovrebbe restituire le righe che includono parole come sirena, siréna, šíreňá .. e così via .. Inoltre dovrebbe lavorare a ritroso quando entra siréná deve restituire gli stessi risultati ..

sto provando a cercare tramite REGEX, la mia domanda è simile al seguente:

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

Funziona solo quando nel database è parola sirena, ma non quando non c'è parola siréňa ..

È perché qualcosa con UTF-8 e MySQL? (la collazione della colonna mysql è utf8_general_ci)

Grazie!

risposta

5

La libreria di espressioni regolari di MySQL non supporta utf-8.

Vedere Bug #30241 Regular expression problems, che è stato aperto dal 2007. Dovranno cambiare la libreria di espressioni regolari che usano prima che possa essere riparata, e non ho trovato alcun annuncio di quando o se lo faranno.

L'unica soluzione che ho visto è la ricerca di specifiche stringhe HEX:

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

Re tuo commento:

No, non so di qualsiasi soluzione con MySQL.

Potrebbe essere necessario passare a PostgreSQL, poiché tale RDBMS supporta i codici \u per i caratteri UTF nel proprio regular expression syntax.

+0

quindi non esiste una soluzione se le mie corde sono variabili? – Maarty

+0

Sono passati due anni da quando hai risposto a questo. Conosci qualche aggiornamento su questo argomento? – emisilva

+0

@emisilva, clicca sul link che ho fornito per verificare lo stato di quel bug. –

0

provare qualcosa di simile ... 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])' 

Funziona per me!

-3

utilizzare la libreria lib_mysqludf_preg dal repository UDF mysql per PCRE espressioni regolari direttamente in mysql

Sebbene libreria di espressione regolare di MySql non supporta UTF-8 repository UDF mysql ha la possibilità di utilizzare utf-8 regex compatibile secondo Espressioni regolari PCRE direttamente in mysql.

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

+0

Sebbene ciò possa teoricamente rispondere alla domanda, [sarebbe preferibile] (// meta.stackoverflow.com/q/8259) includere qui le parti essenziali della risposta e fornire il link per riferimento. –

+0

Sebbene la libreria di espressioni regolari di MySQL non supporti utf-8, il repository UDF mysql ha la possibilità di utilizzare espressioni regolari compatibili utf-8 secondo le espressioni regolari PCRE direttamente in mysql. – Ghanshyam

+0

Ho sprecato il mio tempo nell'installare questa libreria, risulta che non supporta affatto (il che significa gestire correttamente) utf-8. SELECT PREG_RLIKE ('/ aeiou /', 'àèìòù') restituisce 0, proprio come SELECT 'aeiou' RLIKE 'àèìòù' fa. Quindi, questa libreria non è una soluzione al fatto che MySQL non gestisce correttamente utf8. – matteo