Примечание: это решение было предложено @Nick Barnes в его ответе на связанный вопрос .
'a' сдиакритический знак - это последовательность символов, то есть комбинация a и объединяющего символа, диакритический знак ̨: E'a\u0328'
Существует эквивалентный предварительно составленный символ ą :E'\u0105'
Решением было бы нормализовать строки Unicode, то есть преобразовать последовательность символов объединения в предварительно составленный символ перед их сравнением.
К сожалению, Postgres неКажется, что он не имеет встроенной функции нормализации Unicode, но вы легко можете получить к ней доступ через расширение языка PL / Perl или PL / Python .
Дляпример:
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;
Теперь, когда последовательность символов E'a\u0328'
отображается на эквивалентный предварительно составленный символ E'\u0105'
с помощью unicode_normalize
, расстояние Левенштейна является правильным:
select levenshtein(unicode_normalize(E'a\u0328'), 'x');
levenshtein
-------------
1