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'
如有必要,可以更改这些参数。
答案 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/