PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Има ли многобайтов Postgresql Levenshtein?

„А“ с диакритичен знак е последователност от знаци, т.е. комбинация от а и комбиниращ знак, диакритиката ̨ :E'a\u0328'

Има еквивалентен предварително съставен знак ą :E'\u0105'

Решение би било нормализиране Unicode низовете, т.е. за преобразуване на комбинираната последователност от знаци в предварително съставен знак, преди да ги сравните.

За съжаление изглежда, че Postgres няма вградена функция за нормализиране на Unicode, но можете лесно да получите достъп до нея чрез PL/Perl или PL/Python езикови разширения.

Например:

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;

Сега, като последователността от знаци E'a\u0328' се нанася върху еквивалентен предварително съставен знак E'\u0105' чрез използване на unicode_normalize , разстоянието на Левенщайн е правилно:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вмъкнете bytea в тип postgresql json

  2. Използване на параметър като име на колона във функцията Postgres

  3. Премахнете една, неуникална стойност от масив

  4. PostgreSQL колоната не съществува, но всъщност съществува

  5. Сортиране по колона ASC, но първо NULL стойности?