Encoding 转换PLPGSQL/Orafce中的文本

Encoding 转换PLPGSQL/Orafce中的文本,encoding,plpgsql,iso-8859-1,orafce,Encoding,Plpgsql,Iso 8859 1,Orafce,在从Oracle转换之后,我正在使用PL/pgSQL和Orafce。在一个函数中,我正在一个文件中编写。我想用拉丁文1编码。我的数据库是UTF8 有convert函数,但我想我错过了一些东西,因为我似乎没有找到我的用例 convert('testé', 'UTF8', 'LATIN1') ==> in BYTEA test\351 问题是此函数返回的是bytea。如何获得文本?我认为您实际上需要convert\u to函数,该函数将文本从数据库编码转换为bytea以不同编码: SELEC

在从Oracle转换之后,我正在使用PL/pgSQL和Orafce。在一个函数中,我正在一个文件中编写。我想用拉丁文1编码。我的数据库是UTF8

convert
函数,但我想我错过了一些东西,因为我似乎没有找到我的用例

convert('testé', 'UTF8', 'LATIN1') ==> in BYTEA test\351

问题是此函数返回的是
bytea
。如何获得
文本

我认为您实际上需要
convert\u to
函数,该函数将
文本
从数据库编码转换为
bytea
以不同编码:

SELECT convert_to('testé', 'LATIN1');

  convert_to  
--------------
 \x74657374e9
(1 row)
您不能让结果成为
文本
,因为该字节序列不是有效的UTF-8编码字符串,并且PostgreSQL对这种数据损坏是不可原谅的

不幸的是,orafce似乎没有提供将二进制数据写入文件的功能,但
COPY
或许可以帮助您:

COPY (SELECT textdata FROM texttable ORDER BY something)
   TO 'latin1file' (ENCODING 'LATIN1', FORMAT 'csv');

唯一的缺点是
COPY
会转义某些字符,如
,因此您可能需要选择字符串中不出现的分隔符或分隔符。

我认为您实际上需要
转换为
函数,该函数将
文本从数据库编码转换为
以不同编码的
bytea
编码:

SELECT convert_to('testé', 'LATIN1');

  convert_to  
--------------
 \x74657374e9
(1 row)
您不能让结果成为
文本
,因为该字节序列不是有效的UTF-8编码字符串,并且PostgreSQL对这种数据损坏是不可原谅的

不幸的是,orafce似乎没有提供将二进制数据写入文件的功能,但
COPY
或许可以帮助您:

COPY (SELECT textdata FROM texttable ORDER BY something)
   TO 'latin1file' (ENCODING 'LATIN1', FORMAT 'csv');

唯一的缺点是
COPY
会转义某些字符,如
,因此您可能需要选择一个字符串中没有出现的分隔符或分隔符。

是的,我也尝试将转换为,不幸的是,我最后遇到了与bytea相同的问题。对于复制函数,我使用它导出CSV文件,但在我的例子中,我在plpgsql函数中多次依赖UTL_FILE.FILE_TYPE,那么我如何使用复制函数写入文件_TYPE?您将无法使用orafce,因为它不支持写入二进制数据,rigt?是的,这就是为什么我遵循您的建议,我将像这样使用COPY命令:
command:=concat('COPY(',vl_param_query')来编程“cat>>”,vl_param_report_path,”,并使用(编码为“拉丁1”)工作正常。但函数接受两个参数,file UTL_file.file_TYPE和content text。因此,现在我必须找到一种方法,从UTL_FILE.FILE_类型中获取文件路径,这似乎是不可能的
文件类型是什么
?它似乎只是一个表示文件的整数,所以我的函数看起来像
prc_put_行(vl_参数与UTL_FILE.FILE_类型,vl_参数字符串文本)
并且必须在报告中添加一行。因此,我目前的解决方法是添加文件路径,如
set_config('utl_file..| | vl_outputfile,filepath,false)当前设置('utl_file.'.|vl_param_rapht)
将其返回到prc_put_line函数,但我宁愿找到一个更优雅的解决方案是的,我也尝试将其转换为,不幸的是,我在最后遇到了与bytea相同的问题。对于复制函数,我使用它导出CSV文件,但在我的例子中,我在plpgsql函数中多次依赖UTL_FILE.FILE_TYPE,那么我如何使用复制函数写入文件_TYPE?您将无法使用orafce,因为它不支持写入二进制数据,rigt?是的,这就是为什么我遵循您的建议,我将像这样使用COPY命令:
command:=concat('COPY(',vl_param_query')来编程“cat>>”,vl_param_report_path,”,并使用(编码为“拉丁1”)工作正常。但函数接受两个参数,file UTL_file.file_TYPE和content text。因此,现在我必须找到一种方法,从UTL_FILE.FILE_类型中获取文件路径,这似乎是不可能的
文件类型是什么
?它似乎只是一个表示文件的整数,所以我的函数看起来像
prc_put_行(vl_参数与UTL_FILE.FILE_类型,vl_参数字符串文本)
并且必须在报告中添加一行。因此,我目前的解决方法是添加文件路径,如
set_config('utl_file..| | vl_outputfile,filepath,false)当前设置('utl_file..| | vl_param_report)
将其返回到prc_put_line函数中,但我宁愿找到更优雅的解决方案