sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Hay un Postgresql Levenshtein con reconocimiento de multibyte?

La 'a' con un signo diacrítico es una secuencia de caracteres, es decir, una combinación de a y un carácter combinado, el diacrítico ̨ :E'a\u0328'

Hay un carácter precompuesto equivalente ą :E'\u0105'

Una solución sería normalizar las cadenas Unicode, es decir, para convertir la secuencia de caracteres combinados en el carácter precompuesto antes de compararlos.

Desafortunadamente, Postgres no parece tener una función de normalización Unicode incorporada, pero puede acceder fácilmente a una a través de PL/Perl o PL/Python extensiones de idioma.

Por ejemplo:

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;

Ahora, como la secuencia de caracteres E'a\u0328' se asigna al carácter precompuesto equivalente E'\u0105' usando unicode_normalize , la distancia de levenshtein es correcta:

select levenshtein(unicode_normalize(E'a\u0328'), 'x');
levenshtein
-------------
           1