比较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可以根据需要而改变。

+0

我认为你将不得不自己编写。那我们都可以使用它! – 2010-06-16 08:49:31

我在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找到应该就够了。

+0

这样的函数(自写的)似乎是过度的... – binaryLV 2010-06-16 08:55:57

+0

如果你需要有限的字符集(例如只有拉丁字母),这个纯粹的SQL解决方案是最好的。它会很快,很容易理解,并且不需要任何非标准模块。只需获得ISO-8859-1,ISO-8859-2和ISO-8859-15中的所有字符 - 应该足够了。 – Tometzky 2010-06-17 08:57:43

+0

现在,正在使用纯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 -​​

+0

现在无法尝试(我不知道如何在Windows上编译它)。从我读到的内容来看,我不确定pg_collkey是否适用于我们,因为我们需要使用一些简单的模式,例如字符串'%mazs%rukitis%''必须匹配'mazsglāžšķūņurūķītis'。 – binaryLV 2010-06-16 13:05:12