2011-12-27 10 views
17

Esiste un modo per rendere insensibile la query di ricerca?Query di ricerca non sensibile all'accento in MySQL

le regole di confronto della colonna e della tabella sono utf8_polish_ci e non voglio cambiarle.

esempio parola: Torum

select * from pages where title like '%torun%' 

Non trova "Toruń". Come lo posso fare?

+1

http://stackoverflow.com/questions/2302813/normalizing-accented-characters-in-mysql-queries – Sun

+0

@SunWKim L'ho provato prima ma non ha funzionato per me. – ocanal

+0

@ocanal hai trovato una soluzione che puoi condividere con noi? – zvzej

risposta

17

È possibile modificare le regole di confronto in fase di esecuzione della query SQL,

...where title like '%torun%' collate utf8_general_ci 

ma attenzione che cambiare le regole di confronto al volo in fase di esecuzione rinuncia alla possibilità di mysql utilizzando un indice, quindi le prestazioni su grandi tavoli può essere terribile.

Oppure, è possibile copiare la colonna in un'altra colonna, ad esempio searchable_title, ma modificare le regole di confronto su di essa. In realtà è comune fare questo tipo di cose, in cui si copiano i dati, ma si hanno in una forma leggermente diversa che è ottimizzata per alcuni specifici carichi di lavoro/scopo. È possibile utilizzare i trigger come un buon modo per mantenere sincronizzate le colonne duplicate. Questo metodo ha il potenziale per funzionare bene, se indicizzato.

Nota: accertarsi che il proprio db abbia realmente quei caratteri e non entità html. Inoltre, il set di caratteri della tua connessione è importante. Quanto sopra si assume è impostato su utf8, per esempio, tramite set names come set names utf8

In caso contrario, è necessario un introducer per il valore letterale

...where title like _utf8'%torun%' collate utf8_general_ci 

e, naturalmente, il valore nei singoli apici deve essere effettivamente utf8 codificato, anche se il resto della query sql non lo è.

+1

Hai idea del motivo per cui non funziona per Ł (polacco L con accento come nella città di Łódź)? '... dove città come _utf8 '% lodz%' collazionano utf8_general_ci' – suz

4

Questo non funziona in circostanze estreme, ma provare a modificare le regole di confronto delle colonne in UFT8 utf8_unicode_ci. Quindi i personaggi accentati saranno uguali alle loro controparti non accentate.

Problemi correlati