"a" med en diakritisk är en teckensekvens, det vill säga en kombination av a och ett kombinerande tecken, diakritiken ̨ :E'a\u0328'
Det finns ett motsvarande förkomponerat tecken ± :E'\u0105'
En lösning skulle vara att normalisera Unicode-strängarna, det vill säga att konvertera den kombinerade teckensekvensen till det förkomponerade tecknet innan de jämförs.
Tyvärr verkar Postgres inte ha en inbyggd Unicode-normaliseringsfunktion, men du kan enkelt komma åt en via PL/Perl eller PL/Python språktillägg.
Till exempel:
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, som teckensekvensen E'a\u0328'
mappas till det motsvarande förkomponerade tecknet E'\u0105'
genom att använda unicode_normalize
, livshstein-avståndet är korrekt:
select levenshtein(unicode_normalize(E'a\u0328'), 'x');
levenshtein
-------------
1