Accentloos zoeken in databases
Uit Yapf
Spelfouten zijn overal en een van de meestgemaakte spelfouten is het vergeten van accenten zoals ideeen in plaats van 'ideeën. Voor databases zijn tekens met accenten wezenlijk andere tekens dan zonder accenten dus een verkeerdgespeld woordt zal echt niet gevonden worden.
De oplossing hiervoor is dan ook om tijdens het zoeken de accenten weg te laten in zowel de zoekopdracht als de doorzochte data.
PostgreSQL
PostgreSQL kent de functie TO_ASCII() die zoals de naam al aangeeft een string omzet naar ASCII. ASCII tekens kennen geen accenten dus die verdwijnen daardoor.
Het gebruik hiervan heeft een paar haken en ogen door de manier waarop TO_ASCII() is geimplementeerd. Het accepteert geen UTF-8 strings dus de string moet worden omgezet naar Latin1 via CONVERT_TO(), maar daar die geeft zijn uitkomst in BYTEA (voor als je een string omzet naar een multibyte string).
Kortom, het is nodig om een hulpfunctie te maken:
CREATE FUNCTION to_ascii(bytea, name) RETURNS text STRICT AS 'to_ascii_encname' LANGUAGE internal;
En vervolgens kun je de strings omzetten via:
SELECT to_ascii(convert_to('Ideeën', 'latin1'), 'latin1');
En omdat het een functie is kun je het toepassen in een functionele index zodat je op de omgezette strings kunt zoeken zonder bij elke zoekopdracht alles opnieuw om te zetten.
Nog een stap verder kun je een URL mooi opschonen door alle onderdelen (tussen de slashes) te bewerken met een functie die de accenten, spaties en leestekens eruit haalt:
SELECT TRIM(regexp_replace(to_ascii(convert_to('Ideeën van grote & kleine, mensen?!', 'latin1'), 'latin1'),'[^a-z0-9_-]+', '-', 'gi'),'-');
Geeft: Ideeen-van-grote-kleine-mensen
Eventueel zou je de ampersand nog kunnen vervangen door het woordje '-en-' wat nog iets netter is. Afijn, de lucht is de limiet.