PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Existe-t-il un Postgresql Levenshtein multi-octets ?

Le 'a' avec un diacritique est une séquence de caractères, c'est-à-dire une combinaison de a et un caractère combinatoire, le diacritique ̨ :E'a\u0328'

Il existe un caractère précomposé équivalent ± :E'\u0105'

Une solution serait de normaliser les chaînes Unicode, c'est-à-dire pour convertir la séquence de caractères combinatoires en caractère précomposé avant de les comparer.

Malheureusement, Postgres ne semble pas avoir de fonction de normalisation Unicode intégrée, mais vous pouvez facilement y accéder via le PL/Perl ou PL/Python extensions de langue.

Par exemple :

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;

Maintenant, comme la séquence de caractères E'a\u0328' est mappé sur le caractère précomposé équivalent E'\u0105' en utilisant unicode_normalize , la distance levenshtein est correcte :

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