PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Gibt es ein Multibyte-fähiges Postgresql Levenshtein?

Das 'a' mit diakritischem Zeichen ist eine Zeichenfolge, also eine Kombination aus a und ein verbindendes Zeichen, das diakritische Zeichen ̨ :E'a\u0328'

Es gibt ein äquivalentes zusammengesetztes Zeichen ą :E'\u0105'

Eine Lösung wäre normalisieren die Unicode-Strings, d. h. die Kombinationszeichenfolge vor dem Vergleich in das zusammengesetzte Zeichen umzuwandeln.

Leider scheint Postgres keine eingebaute Unicode-Normalisierungsfunktion zu haben, aber Sie können einfach über PL/Perl oder PL/Python Spracherweiterungen.

Zum Beispiel:

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;

Jetzt als Zeichenfolge E'a\u0328' wird auf das äquivalente zusammengesetzte Zeichen E'\u0105' abgebildet durch Verwendung von unicode_normalize , die Levenshtein-Distanz ist korrekt:

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