比较PostgreSQL中的字符串
PostgreSQL中有没有办法将UTF-8字符转换为“类似”ASCII字符 字符串比较PostgreSQL中的字符串,postgresql,search,utf-8,Postgresql,Search,Utf 8,PostgreSQL中有没有办法将UTF-8字符转换为“类似”ASCII字符 字符串必须转换为glazskunu rukisi。UTF-8文本不是某些特定语言,它可能是拉脱维亚语、俄语、英语、意大利语或任何其他语言 这是在where子句中使用时需要的,因此它可能只是“比较字符串”而不是“转换字符串” 我尝试使用convert,但它没有给出所需的结果(例如,选择convert('256'、'utf8'、'sql\u ascii')给出\304\200,而不是A) 数据库是通过以下方式创建的: EN
必须转换为glazskunu rukisi
。UTF-8文本不是某些特定语言,它可能是拉脱维亚语、俄语、英语、意大利语或任何其他语言
这是在where
子句中使用时需要的,因此它可能只是“比较字符串”而不是“转换字符串”
我尝试使用convert
,但它没有给出所需的结果(例如,选择convert('256'、'utf8'、'sql\u ascii')
给出\304\200
,而不是A
)
数据库是通过以下方式创建的:
ENCODING = 'UTF8'
LC_COLLATE = 'Latvian_Latvia.1257'
LC_CTYPE = 'Latvian_Latvia.1257'
如有必要,可以更改这些参数。我在上找到了不同的方法
在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
$$;
create或replace函数uncent(text)将文本语言plpythonu返回为$$
导入Unicode数据
rv=plpy.execute(“从pg_设置中选择设置,其中name='server_encoding'”);
编码=rv[0][“设置”]
s=args[0]。解码(编码)
s=unicodedata.normalize(“NFKD”,s)
s=''.join(如果ord(c)<127,c代表s中的c)
返回s
$$;
在您的情况下,使用中可以找到的所有字符进行translate()调用就足够了。我在上找到了不同的方法
在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
$$;
create或replace函数uncent(text)将文本语言plpythonu返回为$$
导入Unicode数据
rv=plpy.execute(“从pg_设置中选择设置,其中name='server_encoding'”);
编码=rv[0][“设置”]
s=args[0]。解码(编码)
s=unicodedata.normalize(“NFKD”,s)
s=''.join(如果ord(c)<127,c代表s中的c)
返回s
$$;
在您的情况下,使用中可以找到的所有字符进行translate()调用就足够了。使用pg\u collkey()
进行ICU支持的unicode比较:
-
-使用pg\u collkey()
进行ICU支持的unicode比较:
-
-我想你得自己写了。然后我们都可以使用它!我想你得自己写了。然后我们都可以使用它!现在无法尝试(我不知道如何在Windows上编译)。从我所读到的内容来看,我不确定pgèu collkey是否适用于我们,因为我们需要使用一些简单的模式,例如字符串%mazs%rukitis%
必须匹配mazs glāſĹūu rĹītis
。现在无法尝试(我不知道如何在Windows上编译)。从我所读到的内容来看,我不确定pgèu collkey是否适用于我们,因为我们需要使用一些简单的模式,例如字符串%mazs%rukitis%
必须匹配mazs glāſĹūu rĹītis
。如果您需要有限的字符集(例如,仅基于拉丁字母),我认为这种纯SQL解决方案是最好的。它速度快,易于理解,不需要任何非标准模块。只需获取ISO-8859-1、ISO-8859-2和ISO-8859-15中的所有字符就足够了。目前,正在使用纯SQL函数。虽然,它没有我想要的那么好。。。关于提到的字符编码-这是不够的,因为它不包括拉脱维亚语(我来自拉脱维亚)和许多其他语言-至少应该添加ISO-8859-4。为了使它更完整,我从记事本中提取了所有带双字符的字母(只是将所有文本复制到记事本中,并使用ctrl+h删除所有“标准”字符),然后写了相等的拉丁字母,然后将其与模拟提供的示例中的字母连接起来。如果您需要有限的字符集,我认为这种纯SQL解决方案是最好的(例如,仅基于拉丁语的字母表)。它会很快,很容易理解,不需要任何非标准模块。只需获取ISO-8859-1、ISO-8859-2和ISO-8859-15中的所有字符-就足够了。目前,正在使用纯SQL函数。尽管它没有我希望的那么好…关于提到的字符编码-这是不够的,因为它没有涵盖拉脱维亚语(我来自拉脱维亚),可能还有许多其他语言——至少应该添加ISO-8859-4。为了使它更完整,我从中提取了所有带双字符的字母(只是将所有文本复制到记事本中,并使用ctrl+h删除了所有“标准”字符)写了相等的拉丁字母,然后用类比法提供的例子中的字母连接起来。