sql >> Database >  >> RDS >> PostgreSQL

Is er een multibyte-bewuste Postgresql Levenshtein?

De 'a' met een diakritisch teken is een tekenreeks, d.w.z. een combinatie van a en een combinatieteken, het diakritische teken ̨ :E'a\u0328'

Er is een equivalent vooraf samengesteld teken ą :E'\u0105'

Een oplossing zou zijn om normaliseren de Unicode-tekenreeksen, d.w.z. om de gecombineerde tekenreeks om te zetten in het vooraf samengestelde teken voordat ze worden vergeleken.

Helaas lijkt Postgres geen ingebouwde Unicode-normalisatiefunctie te hebben, maar je kunt er gemakkelijk toegang toe krijgen via de PL/Perl of PL/Python taalextensies.

Bijvoorbeeld:

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, als de tekenreeks E'a\u0328' wordt toegewezen aan het equivalente vooraf samengestelde teken E'\u0105' door unicode_normalize . te gebruiken , de levenshtein-afstand is correct:

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



  1. Wat betekent de * asterisk in een mysql-statement?

  2. Een join gebruiken met drie tabellen wanneer een veld mogelijk null is

  3. Verleen selectierecht aan rijen met voorwaarde

  4. Refactor externe sleutel naar velden