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

jpm*_*c26 1 oracle utf-8 character-encoding windows-1252

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

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

SELECT CHR(TO_NUMBER('C3A1', 'xxxx')) FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

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

SELECT CHR(TO_NUMBER('00E1', 'xxxx')) FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

我似乎无法找到一种方法让Oracle只取一个并将其转换为正确的编码.我真的不在乎我最终使用哪种表示方式.我只想使用一个十六进制值,因为同一个脚本需要在两个数据库上运行.我怎样才能做到这一点?

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

Rim*_*mas 5

两个功能可以帮助UNISTRTO_CHAR:

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

    SELECT UNISTR('\00E1') FROM DUAL;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 要在数据库字符集中返回:

    SELECT TO_CHAR(UNISTR('\00E1')) FROM DUAL;
    
    Run Code Online (Sandbox Code Playgroud)

来自UNISTR文件:

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

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

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

TO_CHAR(字符)文档:

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