1

我有几个 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;

这给了我我想要的 Windows 1252 数据库:

SELECT CHR(TO_NUMBER('00E1', 'xxxx')) FROM DUAL;

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

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

4

1 回答 1

5

UNISTR有两个功能可以帮助您TO_CHAR

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

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

     SELECT TO_CHAR(UNISTR('\00E1')) FROM DUAL;
    

来自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(character)文档:

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

于 2014-10-15T19:51:15.237 回答