PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Existe um Postgresql Levenshtein com reconhecimento de multibyte?


O 'a' com um diacrítico é uma sequência de caracteres, ou seja, uma combinação de a e um caractere de combinação, o diacrítico ̨ :E'a\u0328'

Existe um caractere pré-composto equivalente ± :E'\u0105'

Uma solução seria normalizar as strings Unicode, ou seja, para converter a sequência de caracteres combinada no caractere pré-composto antes de compará-los.

Infelizmente, o Postgres não parece ter uma função de normalização Unicode integrada, mas você pode acessar facilmente uma através do PL/Perl ou PL/Python extensões de idioma.

Por exemplo:
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;

Agora, como a sequência de caracteres E'a\u0328' é mapeado no caractere pré-composto equivalente E'\u0105' usando unicode_normalize , a distância levenshtein está correta:
select levenshtein(unicode_normalize(E'a\u0328'), 'x');
levenshtein
-------------
           1