sql >> Databáze >  >> RDS >> PostgreSQL

Existuje vícebajtový Postgresql Levenshtein?

Písmeno „a“ s diakritikou je posloupnost znaků, tj. kombinace a a spojovací znak, diakritiku ̨ :E'a\u0328'

Existuje ekvivalentní předem složený znak ą :E'\u0105'

Řešením by bylo normalizovat řetězce Unicode, tj. převedení sekvence kombinujících znaků na předem složený znak před jejich porovnáním.

Bohužel se zdá, že Postgres nemá vestavěnou funkci normalizace Unicode, ale můžete k ní snadno přistupovat prostřednictvím PL/Perl nebo PL/Python jazyková rozšíření.

Například:

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;

Nyní jako sekvence znaků E'a\u0328' je namapován na ekvivalentní předem složený znak E'\u0105' pomocí unicode_normalize , levenshteinská vzdálenost je správná:

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



  1. umístění datového adresáře mysql

  2. SQL Server:výpočet rozsahů dat

  3. Chyba PG COPY:neplatná vstupní syntaxe pro celé číslo

  4. časový rozdíl mezi dvěma řádky - mysql