PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Czy istnieje wielobajtowy Postgresql Levenshtein?

„a” ze znakiem diakrytycznym to sekwencja znaków, czyli kombinacja a oraz znak łączący, znak diakrytyczny ̨ :E'a\u0328'

Istnieje równoważny przedłożony znak ą :E'\u0105'

Rozwiązaniem byłoby normalizacja ciągi Unicode, tj. konwertowanie połączonej sekwencji znaków na prekomponowany znak przed ich porównaniem.

Niestety Postgres nie ma wbudowanej funkcji normalizacji Unicode, ale możesz łatwo uzyskać do niej dostęp za pośrednictwem PL/Perl lub PL/Python rozszerzenia językowe.

Na przykład:

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;

Teraz, jako sekwencja znaków E'a\u0328' jest mapowany na równoważny prekomponowany znak E'\u0105' używając unicode_normalize , odległość levenshteina jest prawidłowa:

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. Jak działa current_timestamp() w PostgreSQL

  2. Znajdź subskrybentów, którzy nie odnowili subskrypcji w ramach progu starej subskrypcji

  3. Zapytania Java przeciwko PGPool II powodują, że nienazwana przygotowana instrukcja nie zawiera błędów

  4. PG::UndefinedObject:BŁĄD:typ hstore nie istnieje, ale istnieje

  5. PostgreSQL 9.4:Aggregate / Join table na identyfikator pola JSON wewnątrz tablicy