сравнение строк в PostgreSQL - PullRequest
1 голос
/ 16 июня 2010

Есть ли в PostgreSQL какой-либо способ преобразовать символы UTF-8 в "похожие" символы ASCII?

Строка glāžšķūņu rūķīši должна быть преобразована в glazskunu rukisi.Текст UTF-8 не на каком-то определенном языке, он может быть на латышском, русском, английском, итальянском или любом другом языке.

Это необходимо для использования в предложении where, поэтому это может быть просто "Сравнение строк ", а не" преобразование строк ".

Я пытался использовать convert, но это не дает желаемых результатов (например, select convert('Ā', 'utf8', 'sql_ascii') дает \304\200, а не A).

База данных создается с помощью:

ENCODING = 'UTF8'
LC_COLLATE = 'Latvian_Latvia.1257'
LC_CTYPE = 'Latvian_Latvia.1257'

Эти параметры могут быть изменены при необходимости.

Ответы [ 2 ]

2 голосов
/ 16 июня 2010

Я нашел разные способы сделать это на PostgreSQL Wiki .

В plperl:

CREATE OR REPLACE FUNCTION unaccent_string(text) RETURNS text AS $$
my ($input_string) = @_;
$input_string =~ s/[âãäåāăą]/a;
$input_string =~ s/[ÁÂÃÄÅĀĂĄ]/A;
$input_string =~ s/[èééêëēĕėęě]/e;
$input_string =~ s/[ĒĔĖĘĚ]/E;
$input_string =~ s/[ìíîïìĩīĭ]/i;
$input_string =~ s/[ÌÍÎÏÌĨĪĬ]/I;
$input_string =~ s/[óôõöōŏő]/o;
$input_string =~ s/[ÒÓÔÕÖŌŎŐ]/O;
$input_string =~ s/[ùúûüũūŭů]/u;
$input_string =~ s/[ÙÚÛÜŨŪŬŮ]/U;
return $input_string;
$$ LANGUAGE plperl;

В чистом SQL:

CREATE OR REPLACE FUNCTION unaccent_string(text)
RETURNS text
IMMUTABLE
STRICT
LANGUAGE SQL
AS $$
SELECT translate(
    $1,
    'âãäåāăąÁÂÃÄÅĀĂĄèééêëēĕėęěĒĔĖĘĚìíîïìĩīĭÌÍÎÏÌĨĪĬóôõöōŏőÒÓÔÕÖŌŎŐùúûüũūŭůÙÚÛÜŨŪŬŮ',
    'aaaaaaaaaaaaaaaeeeeeeeeeeeeeeeiiiiiiiiiiiiiiiiooooooooooooooouuuuuuuuuuuuuuuu'
);
$$;

А в plpython:

create or replace function unaccent(text) returns text language plpythonu as $$
import unicodedata
rv = plpy.execute("select setting from pg_settings where name = 'server_encoding'");
encoding = rv[0]["setting"]
s = args[0].decode(encoding)
s = unicodedata.normalize("NFKD", s)
s = ''.join(c for c in s if ord(c) < 127)
return s
$$;

В вашем случае достаточно вызова translate () со всеми символами, которые можно найти в таблице UTF-8 .

1 голос
/ 16 июня 2010

Используйте pg_collkey() для сравнения поддерживаемых ICU Unicode: - http://www.public -software-group.org / pg_collkey - http://russ.garrett.co.uk/tag/postgresql/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...