比较PostgreSQL中的字符串
PostgreSQL有没有办法将UTF-8字符转换为“相似”的ASCII字符?比较PostgreSQL中的字符串
字符串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'
这些PARAMS可以根据需要而改变。
我在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找到应该就够了。
这样的函数(自写的)似乎是过度的... – binaryLV 2010-06-16 08:55:57
如果你需要有限的字符集(例如只有拉丁字母),这个纯粹的SQL解决方案是最好的。它会很快,很容易理解,并且不需要任何非标准模块。只需获得ISO-8859-1,ISO-8859-2和ISO-8859-15中的所有字符 - 应该足够了。 – Tometzky 2010-06-17 08:57:43
现在,正在使用纯SQL函数。虽然它不如我想要的那么好......关于提到的字符编码 - 这还不够,因为它不包括拉脱维亚语(我来自拉脱维亚),也可能包括许多其他语言 - 至少ISO-应该加上8859-4。为了使它更加完整,我从http://en.wikipedia.org/wiki/Diacritic中取出所有带有diactrics的字母(只需复制到记事本中的所有文本,并通过使用Ctrl + h删除所有“标准”字符)拉丁文字母,然后加上来自模拟提供的例子的信件。 – binaryLV 2010-06-17 09:16:56
使用pg_collkey()
的ICU支持的Unicode比较: - http://www.public-software-group.org/pg_collkey -
现在无法尝试(我不知道如何在Windows上编译它)。从我读到的内容来看,我不确定pg_collkey是否适用于我们,因为我们需要使用一些简单的模式,例如字符串'%mazs%rukitis%''必须匹配'mazsglāžšķūņurūķītis'。 – binaryLV 2010-06-16 13:05:12
我认为你将不得不自己编写。那我们都可以使用它! – 2010-06-16 08:49:31