比较PostgreSQL中的字符串

时间:2010-06-16 08:39:29

标签: postgresql search utf-8

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 个答案:

答案 0 :(得分:2)

我在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
$$;

在您的情况下,使用UTF-8 table中可以找到的所有字符进行的translate()调用就足够了。

答案 1 :(得分:1)

使用pg_collkey()进行ICU支持的unicode比较:   - http://www.public-software-group.org/pg_collkey   - http://russ.garrett.co.uk/tag/postgresql/