我有几个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。)
答案 0 :(得分:5)
您可以使用两个功能UNISTR
和TO_CHAR
:
要返回数据库的国家字符集:
SELECT UNISTR('\00E1') FROM DUAL;
要返回数据库字符集:
SELECT TO_CHAR(UNISTR('\00E1')) FROM DUAL;
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。