使用utl_file.put_line写入文件时如何丢弃Oracle UTF-8字符

时间:2014-01-20 14:37:06

标签: oracle utf-8

我使用以下代码写入Oracle PL / SQL中的文件。

l_file := utl_file.fopen('HR_OUT', 'TRUMEDAID.txt', 'w');
utl_file.put_line
(
   l_file,
   utl_raw.cast_to_varchar2
   (
      utl_raw.convert
      (
         utl_raw.cast_to_raw(rec_text),
         'AMERICAN_AMERICA.WE8ISO8859P1',   -- To character set.
         'AMERICAN_AMERICA.AL32UTF8'        -- From Character set.
      )
   )
);

但是,这不会丢弃UTF-8字符,而是会将Pamêla&~翻译为Pam�&~。还有另一种方式至少会给Pam�la&~吗?为什么不使用ascii角色?

2 个答案:

答案 0 :(得分:1)

不确定为什么要投射到RAW并再次返回。您可以使用CONVERT功能。输入字符串可以是CHAR,VARCHAR2,CLOB等。请参阅:http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions027.htm#SQLRF00620

您只需指定目标字符集,因为它将数据库字符集作为默认源。

此外,在这些情况下,永远不要相信所产生的字母串。使用dump()函数调查组成字符串的字节值。这样,您可以确定字符串是否由正确的值组成。

答案 1 :(得分:0)

select utl_raw.cast_to_varchar2
       (
          utl_raw.convert
          (
             utl_raw.cast_to_raw(first_name),
             'AMERICAN_AMERICA.US7ASCII',   -- To character set.
             'AMERICAN_AMERICA.AL32UTF8'        -- From Character set.
          )
       ) 
from   per_all_people_f
where  employee_number = '212164'

为我工作