Postgresql 如何确定列中的值是否可以在Postgres中编码为拉丁语

Postgresql 如何确定列中的值是否可以在Postgres中编码为拉丁语,postgresql,latin,Postgresql,Latin,我的Postgres数据库将所有内容编码为UTF-8,但在查询中,当选择一列时,我想知道它是否可以编码为拉丁语。我不需要把它编码成拉丁语,但我需要知道它是否可以被编码成拉丁语 拉丁语是指其他人通常所说的拉丁语,即西欧人可以识别的字符 i、 e 解决方案 我使用了下面发布的答案,首先我尝试了python函数,但失败了,因为我没有安装该语言。然后我尝试了pl/sql函数,但由于缺少RETURN语句而失败,但我修复了如下问题,现在可以正常工作 CREATE OR REPLACE FUNCTION is

我的Postgres数据库将所有内容编码为UTF-8,但在查询中,当选择一列时,我想知道它是否可以编码为拉丁语。我不需要把它编码成拉丁语,但我需要知道它是否可以被编码成拉丁语

拉丁语是指其他人通常所说的拉丁语,即西欧人可以识别的字符

i、 e

解决方案

我使用了下面发布的答案,首先我尝试了python函数,但失败了,因为我没有安装该语言。然后我尝试了pl/sql函数,但由于缺少RETURN语句而失败,但我修复了如下问题,现在可以正常工作

CREATE OR REPLACE FUNCTION is_latin(input text)
RETURNS boolean
LANGUAGE plpgsql
IMMUTABLE
AS $$
BEGIN
  PERFORM convert_to(input, 'iso-8859-15');
  RETURN true;
EXCEPTION
  WHEN untranslatable_character THEN
    RETURN false;
END;
$$;

嗯,你需要对“拉丁语”更具体一些

假设你指的是ISO-8859-15,典型的西欧标准

regress=> SELECT convert_to('a€bcáéíöâ', 'iso-8859-15');
      convert_to      
----------------------
 \x61a46263e1e9edf6e2
(1 row)
注意,人们经常使用
iso-8859-1
,但它不支持€

但是,您会遇到货币符号和其他可能出现在现代西欧文本中的问题。例如₽ 不是ISO-8859-15的一部分。也不是฿,₡,₹, 和其他主要货币。(奇怪的是,¥在ISO-8859-15中)

如果希望测试时不出错,则需要使用PL/Python或类似工具,或者使用PL/PgSQL并捕获异常

CREATE OR REPLACE FUNCTION is_latin(input text)
RETURNS boolean
LANGUAGE plpgsql
IMMUTABLE
AS $$
BEGIN
  PERFORM convert_to(input, 'iso-8859-15');
EXCEPTION
  WHEN untranslatable_character THEN
    RETURN false;
END;
$$;

regress=> SELECT is_latin('฿');
 is_latin 
----------
 f
(1 row)
不过,这在每次通话中都会产生一个保存点,这可能会很昂贵。因此,PL/Python可能更好。这是一个关于
服务器编码的假设(假设它是utf-8),这是不明智的,因此它应该正确地检查它。无论如何:

CREATE OR REPLACE FUNCTION is_latin(input text)
RETURNS boolean
LANGUAGE plpythonu
IMMUTABLE
AS $$
try:
    input.decode("utf-8").encode("iso-8859-1")
    return True
except UnicodeEncodeError:
    return False
$$;
另一种选择是创建一个正则表达式,其中的字符集与您希望允许的所有字符相匹配,但我怀疑这会很慢而且很难看。不完整示例:

SELECT 'ab฿cdé' ~ '^[a-zA-Z0-9.áéíóúÁÉÍÓÚàè]*$'

。。。您可能会使用iso-8859-15编码表生成字符列表。

Thx,是的,我有点不确定拉丁语是什么意思。但是就像我说的,我不需要转换它,只要知道它是否可以转换,我怎么能用convert来检查where子句,就像在psuedo代码中一样?我补充说调用的代码是纯SQL,我可以创建一个安装函数,但我不明白PL/SQL为什么/在哪里做保存点。@PaulTaylor
BEGIN。。异常
是一个隐式保存点。请参阅PostgreSQL文档了解PL/PgSQL控制结构。我需要检查iso-8859-15和iso-8859-16,如果两者匹配,则应返回true。我尝试过修改它,但无法使其工作,请提供帮助?
SELECT 'ab฿cdé' ~ '^[a-zA-Z0-9.áéíóúÁÉÍÓÚàè]*$'