De 'a' met een diakritisch teken is een tekenreeks, d.w.z. een combinatie van a en een combinatieteken, het diakritische teken ̨ :E'a\u0328'
Er is een equivalent vooraf samengesteld teken ą :E'\u0105'
Een oplossing zou zijn om normaliseren de Unicode-tekenreeksen, d.w.z. om de gecombineerde tekenreeks om te zetten in het vooraf samengestelde teken voordat ze worden vergeleken.
Helaas lijkt Postgres geen ingebouwde Unicode-normalisatiefunctie te hebben, maar je kunt er gemakkelijk toegang toe krijgen via de PL/Perl of PL/Python taalextensies.
Bijvoorbeeld:
create extension plpythonu;
create or replace function unicode_normalize(str text) returns text as $$
import unicodedata
return unicodedata.normalize('NFC', str.decode('UTF-8'))
$$ language plpythonu;
Nu, als de tekenreeks E'a\u0328'
wordt toegewezen aan het equivalente vooraf samengestelde teken E'\u0105'
door unicode_normalize
. te gebruiken , de levenshtein-afstand is correct:
select levenshtein(unicode_normalize(E'a\u0328'), 'x');
levenshtein
-------------
1