如何避免红移Python UDF中的UnicodeDecodeError ascii错误?

如何避免红移Python UDF中的UnicodeDecodeError ascii错误?,python,amazon-redshift,user-defined-functions,Python,Amazon Redshift,User Defined Functions,我正在使用一个红移用户定义函数来解释postgresql中的文本,但出现以下错误: UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128). 所有python代码实际上都没有调用decode(),但它似乎发生在后台,但我不知道如何阻止它这样做 udf的返回类型是VARCHAR。您是如何获得0xff的?红移以UTF-8编码,所以不应该在那里。尝试找到它并找出

我正在使用一个红移用户定义函数来解释postgresql中的文本,但出现以下错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128).
所有python代码实际上都没有调用decode(),但它似乎发生在后台,但我不知道如何阻止它这样做


udf的返回类型是VARCHAR。

您是如何获得0xff的?红移以UTF-8编码,所以不应该在那里。尝试找到它并找出它存在的原因

Redshift的Python引擎是Python2,因此字符串是ByTestRing,而不是unicode字符串,而Redshift奇怪地假设从Python UDF返回的字节字符串是ASCII。您没有指定,但我假设您返回的是VARCHAR。在返回python字符串之前,您可能只需要对其调用
.decode('utf-8')

由于红移UDF当前使用Python 2.7,因此需要设置默认编码

CREATE OR REPLACE FUNCTION f_utf8_test(value VARCHAR(128))
    RETURNS VARCHAR(128)
STABLE
AS $$
  import sys
  reload(sys)
  sys.setdefaultencoding("utf-8")
  a=value
  return a
$$ LANGUAGE plpythonu;

不知道你为什么会被否决。。。尽管显示代码会非常有用。对不起,我不做红移,所以帮不了什么忙。考虑联系亚马逊的支持,它通常在客户端出现吗?如果是这样,那么它不会保存为0xff,您必须提供代码,以便我们可以看到从utf转换为ascii的位置