从单个字符代码中获取非ASCII字符

时间:2014-10-15 19:15:14

标签: oracle utf-8 character-encoding windows-1252

我有几个NLS字符编码不同的数据库。一个使用AL32UTF8(UTF-8),另一个使用WE8MSWIN1252(Windows 1252)。是的,这很糟糕,我会努力让事情理顺,所以他们是一样的。与此同时,我需要编写一些包含非ASCII字符的SQL。例如,我需要使用á,即Unicode中的U+00E1。在UTF-8中,它用十六进制值0xC3A1表示,在Windows 1252中用十六进制值0x00E1表示。 (换句话说,那些是字节值。)

所以这给了我想要的UTF-8数据库:

SELECT CHR(TO_NUMBER('C3A1', 'xxxx')) FROM DUAL;

这给了我在Windows 1252数据库上想要的东西:

SELECT CHR(TO_NUMBER('00E1', 'xxxx')) FROM DUAL;
但是,我似乎无法找到一种让Oracle获取一个并将其转换为正确编码的方法。我真的不在乎我最终使用哪种表示方式。我只想使用一个十六进制值,因为同一个脚本需要在两个数据库上运行。我怎么能这样做?

使用Oracle 11g。 (不幸的是,一个是11.1,另一个是11.2。)

1 个答案:

答案 0 :(得分:5)

您可以使用两个功能UNISTRTO_CHAR

  1. 要返回数据库的国家字符集:

    SELECT UNISTR('\00E1') FROM DUAL;
    
  2. 要返回数据库字符集:

    SELECT TO_CHAR(UNISTR('\00E1')) FROM DUAL;
    
  3. From UNISTR documentation

      

    UNISTR将文本文字或表达式作为参数,解析为字符数据并将其返回到国家字符集中。数据库的国家字符集可以是AL16UTF16或UTF8。 UNISTR允许您指定字符串中字符的Unicode编码值,从而为Unicode字符串文字提供支持。例如,这对于将数据插入NCHAR列非常有用。

         

    Unicode编码值的格式为'\ xxxx',其中'xxxx'是UCS-2编码格式的字符的十六进制值。补充字符编码为两个代码单元,第一个来自高代理范围(U + D800到U + DBFF),第二个来自低代理范围(U + DC00到U + DFFF)。要在字符串本身中包含反斜杠,请在其前面加上另一个反斜杠(\)。

         

    对于可移植性和数据保留,Oracle建议在UNISTR字符串参数中仅指定ASCII字符和Unicode编码值。

    From TO_CHAR(character) documenation:

      

    TO_CHAR(character)将NCHAR,NVARCHAR2,CLOB或NCLOB数据转换为数据库字符集。返回的值始终为VARCHAR2。