PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Esiste un Postgresql Levenshtein multibyte?

La 'a' con un segno diacritico è una sequenza di caratteri, ovvero una combinazione di a e un carattere combinatorio, il diacritico ̨ :E'a\u0328'

Esiste un carattere precomposto equivalente ą :E'\u0105'

Una soluzione sarebbe normalizzare le stringhe Unicode, ovvero convertire la sequenza di caratteri combinati nel carattere precomposto prima di confrontarle.

Sfortunatamente, Postgres non sembra avere una funzione di normalizzazione Unicode incorporata, ma puoi accedervi facilmente tramite PL/Perl o PL/Python estensioni di lingua.

Ad esempio:

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;

Ora, come sequenza di caratteri E'a\u0328' è mappato sul carattere precomposto equivalente E'\u0105' utilizzando unicode_normalize , la distanza di levenshtein è corretta:

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