Oracle数据库 - 字符集

时间:2018-02-13 21:56:58

标签: plsql character-encoding character oracle12c database-administration

当我使用sqlplus或任何其他工具编译时,如何在包中保留特殊字符?

  

NLS_CHARACTERSET:WE8MSWIN1252
  客户角色的集合:未知
  问题是:数据呈现
  操作系统和数据库:UNIX \ Oracle Database 12c企业版12.1.0.2.0版 - 64位生产

     

Oracle Database 12c企业版12.1.0.2.0版 - 64位生产
  PL / SQL版本12.1.0.2.0 - 生产
  核心12.1.0.2.0生产
  适用于Linux的TNS:版本12.1.0.2.0 - 生产
  NLSRTL版本12.1.0.2.0 - 生产

示例:

CREATE OR REPLACE PACKAGE BODY pkg1
AS
  procedure sp 
  IS
  v_var VARCHAR2(100);
  BEGIN
        v_var := '**último**';
  END;

   END;

当我描述包时看起来像这样:

CREATE OR REPLACE PACKAGE BODY HR.pkg1
AS
  procedure sp
  IS
  v_var VARCHAR2(100);
  BEGIN
        v_var := '**£ltimo**';     
  END;


   END;

1 个答案:

答案 0 :(得分:0)

有通用的方法将任意unicode数据输入oracle数据库,将自己限制为ascii charset:

  1. 将目标文本的utf-8表示确定为十六进制的字节序列。

    使用utf8-savvy编辑器并输入要传输到db的文本。许多编辑器都带有十六进制模式,允许您检查utf8表示并将其写在其他地方。或者使用专用的十六进制编辑器或使用像od(linux)这样的cli工具来生成文件内容,作为以十六进制表示的八位字节的列表序列:

     od --output-duplicates --format x1 --width=16 demo.txt
    

    输出需要一些后处理来消除行号和空白,但是,这应该是直截了当的。对于批量数据,请使用sed或类似工具。

  2. 将十六进制字符串转换为oracle' s raw数据类型。

    在PlSql中调用HEXTORAW(x)可以解决问题。

  3. raw数据转换为varchar2,即。数据库字符集。

    使用plsql包过程utl_i18n.raw_to_char。它的第二个参数指定源编码。

  4. 总之,该方法归结为类似的查询(测试字符串是小写字母af,后跟德语变音符号):

     select utl_i18n.raw_to_char ( hextoraw ( '616263646566c3a4c3b6c3bcc384c396c39cc39f' ), 'AL32UTF8' ) from dual;
    

    在你的包中你会写:

     v_var := '**' || utl_i18n.raw_to_char ( hextoraw ( 'c3ba' ), 'AL32UTF8' )
                   || 'ltimo**';
       -- c3ba being the utf8 encoding of unicode codepoint U+00fa,
       -- 'LATIN SMALL LETTER U WITH ACUTE'
    

    显然,只有数据库字符集能够首先表示字符时,该技术才有效。

    <强>快捷方式

    1. 只要db知道该编码,您就可以使用任何其他编码所需特殊字符的源代码。即,可以使用用于拉丁字母的iso 8859-x系列编码。对于ú和iso8859-1:

      的情况
       v_var := utl_i18n.raw_to_char ( hextoraw ( 'fa' ), 'WE8ISO8859P1' ) from dual;
      
    2. 在数据库中使用国家字符集,您可以在文字字符串中按代码点输入unicode字符。只需使用UNISTR函数包装文字字符串:

      v_var := TO_CHAR(UNISTR('**\00faltimo**')) from dual;