UTL_FILE操作在输出文件中生成特殊字符

时间:2016-03-16 14:11:15

标签: sql database oracle

我们在Oracle DB中存储了一些String值。我们将这些值写入.DAT文件。我们的包中的查询片段如下所示:

打开文件:

l_file := UTL_FILE.fopen(l_dir, l_file_name, 'W');

写入档案:

UTL_FILE.putf(l_file, ('E' ||';'|| TO_CHAR(l_rownum) ||';'|| TO_CHAR(v_cdr_session_id_seq) ||';' || l_record_data));

数据库中的字符串值: "Owner’s address"

.DAT文件中的字符串值: "Owner’s address"

问题是:如何在将其写入输出文件时避免使用这些特殊字符?

2 个答案:

答案 0 :(得分:2)

我假设您的数据库使用字符集AL32UTF8(现在是默认值)。在这种情况下试试这个:

l_file := UTL_FILE.FOPEN_NCHAR(l_dir, l_file_name, 'W');

PUT_NCHAR(l_file, ('E;'|| l_rownum ||';'|| v_cdr_session_id_seq||';' ||l_record_data);

注意函数FOPEN_NCHAR即使NVARCHAR2缓冲区的内容可能是AL16UTF16或UTF8(取决于数据库的国家字符集),也始终读取和写入文件的内容在UTF8。

答案 1 :(得分:1)

总结来自评论,您的Linux会话和Vim配置都使用UTF-8,但您的终端仿真器软件正在使用Windows-1252 codepage。这会将您所拥有的“卷曲”右引号标记Unicode codepoint 2019)呈现为’

您需要将模拟器的配置从Windows-1252更改为UTF-8。具体取决于您使用的是哪个模拟器。例如,在PuTTY中,您可以通过右键单击窗口标题栏并选择“更改设置...”来更改当前会话,然后转到“窗口”类别及其“翻译”子类别,并更改默认“Win 252(Western)”到“UTF-8”。

PuTTY reconfiguration dialog

如果您在Vim中打开文件,则可以控制-L重绘它。这只会影响当前的会议;要使更改永久化,您需要对存储的会话设置进行相同的更改,从“新会话...”对话框 - 加载当前设置,并记住在实际打开新会话之前保存更改。 / p>

其他模拟器具有类似的设置,但在不同的地方。对于XShell,according to their web site

  

您可以通过在标准工具栏上的编码列表中选择Unicode(UTF8)轻松切换到UTF8编码。

看起来您也可以为会话设置or as the default