„a” ze znakiem diakrytycznym to sekwencja znaków, czyli kombinacja a oraz znak łączący, znak diakrytyczny ̨ :E'a\u0328'
Istnieje równoważny przedłożony znak ą :E'\u0105'
Rozwiązaniem byłoby normalizacja ciągi Unicode, tj. konwertowanie połączonej sekwencji znaków na prekomponowany znak przed ich porównaniem.
Niestety Postgres nie ma wbudowanej funkcji normalizacji Unicode, ale możesz łatwo uzyskać do niej dostęp za pośrednictwem PL/Perl lub PL/Python rozszerzenia językowe.
Na przykład:
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;
Teraz, jako sekwencja znaków E'a\u0328'
jest mapowany na równoważny prekomponowany znak E'\u0105'
używając unicode_normalize
, odległość levenshteina jest prawidłowa:
select levenshtein(unicode_normalize(E'a\u0328'), 'x');
levenshtein
-------------
1