Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较PostgreSQL中的字符串_Postgresql_Search_Utf 8 - Fatal编程技术网

比较PostgreSQL中的字符串

比较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

PostgreSQL中有没有办法将UTF-8字符转换为“类似”ASCII字符

字符串
必须转换为
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删除了所有“标准”字符)写了相等的拉丁字母,然后用类比法提供的例子中的字母连接起来。