我使用node-oracle连接到Oracle数据库。
当我从带有西里尔数据的表中选择值时,一切都很好,但是如果我这样称为procudure:
CREATE OR REPLACE PROCEDURE TEST_ENCODING (CUR OUT SYS_REFCURSOR) AS
BEGIN
open cur for
select 'тест' as hello from dual; -- cyrillic hardcoded text
END TEST_ENCODING;
然后从节点调用它:
connection.execute("call TEST_ENCODING(:1)", [new oracle.OutParam(oracle.OCCICURSOR)],
function (err, result) {
console.log(result)
}
);
结果是:[ { HELLO: 'те' } ]
(字符串被减半)。
数据库配置如下:
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET CL8MSWIN1251
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_RDBMS_VERSION 11.2.0.3.0
在我的本地环境中:NLS_LANG=AMERICAN_AMERICA.UTF8
(还尝试了NLS_LANG=RUSSIAN_RUSSIA.UTF8
和RUSSIAN_RUSSIA.AL32UTF8
,结果相同)
我的配置:
Mac OS X 10.9
Oracle Client 11.2
节点0.10.22
node-oracle 0.3.4
答案 0 :(得分:1)
似乎暂时不支持UTF8
中node-oracle
以外的编码,因为node.js
不支持原生编码(proof)。< / p>
要正确处理字符串,您需要在客户端上将NLS_LANG参数设置为与数据库中相同的值(CL8MSWIN1251)
因此,您可以从2种变体中进行选择:
A)Migrate database到UTF8
编码。
B)修补程序node-oracle
source将字符串和CLOB转换为UTF8
,然后将内容返回到node.js并在将UTF8
转换为CL8MSWIN1251
之前将其传递给Oracle 。对于此类转换,OCI interface有一个functions。例如。出于本地目的,只需在utils.h
OBJ_GET_STRING
宏即可
P.S。 node-oracle
目前看起来非常简单,所以要为许多惊喜做好准备(例如,不支持BLOB和集合,缺少连接设置等等。)
答案 1 :(得分:0)
可能是因为当本地设置指定UTF8时,您的数据库主charset是CL8MSWIN1251。
NLS_CHARACTERSET CL8MSWIN1251
变量NLS_LANG指定如何解释您的本地环境
NLS_LANG = language_territory.charset
NLS_LANG的最后一部分提供了有关本地字符集的信息,它用于让Oracle知道您在客户端使用的字符集,因此Oracle可以进行正确的转换。当没有正确识别双表的值字符集时,表格中的值可能会正确转换。
请尝试将NLS_LANG变量设置为AMERICAN_AMERICA.CL8MSWIN1251(或俄语_RUSSIA.CL8MSWIN1251,这并不重要)
答案 2 :(得分:0)
你确定你的源代码有UTF-8字符集吗?
如果只有硬编码符号的问题可能您的Oracle开发GUI不支持UTF-8
我在我的包中使用像¥这样的特殊字符以及将特殊字符转换为某些不可读的字符的类似问题