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

Er der en multibyte-bevidst Postgresql Levenshtein?

'a'et' med en diakritisk er en tegnsekvens, dvs. en kombination af a og et kombineret tegn, diakritikken ̨ :E'a\u0328'

Der er et tilsvarende prækomponeret tegn ± :E'\u0105'

En løsning ville være at normalisere Unicode-strengene, dvs. at konvertere den kombinerede tegnsekvens til det prækomponerede tegn, før de sammenlignes.

Desværre ser Postgres ikke ud til at have en indbygget Unicode-normaliseringsfunktion, men du kan nemt få adgang til en via PL/Perl eller PL/Python sprogudvidelser.

For eksempel:

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;

Nu, som tegnsekvensen E'a\u0328' er afbildet på det tilsvarende prækomponerede tegn E'\u0105' ved at bruge unicode_normalize , Leveshtein-afstanden er korrekt:

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



  1. SQL dataopdagelse og klassificering

  2. Hvordan man selv opdaterer PHP+MySQL CMS?

  3. Forsøger at returnere alle kolonner med underordnede poster for en overordnet post

  4. Skrivning til MySQL-database med pandaer ved hjælp af SQLAlchemy, to_sql