sql >> Databasteknik >  >> RDS >> PostgreSQL

Finns det en multibyte-medveten Postgresql Levenshtein?

"a" med en diakritisk är en teckensekvens, det vill säga en kombination av a och ett kombinerande tecken, diakritiken ̨ :E'a\u0328'

Det finns ett motsvarande förkomponerat tecken ± :E'\u0105'

En lösning skulle vara att normalisera Unicode-strängarna, det vill säga att konvertera den kombinerade teckensekvensen till det förkomponerade tecknet innan de jämförs.

Tyvärr verkar Postgres inte ha en inbyggd Unicode-normaliseringsfunktion, men du kan enkelt komma åt en via PL/Perl eller PL/Python språktillägg.

Till exempel:

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 teckensekvensen E'a\u0328' mappas till det motsvarande förkomponerade tecknet E'\u0105' genom att använda unicode_normalize , livshstein-avståndet är korrekt:

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



  1. Hur man skriver en anpassad CrudRepository-metod(@Query) för att filtrera resultatet i mitt fall

  2. Postgresql trunkerat tabell med främmande nyckel begränsning

  3. Vad betyder exec sp_reset_connection i SQL Server Profiler?

  4. Räkna tecken i sekvenser via SQL