使用node-oracle将硬编码的string切成两半

我使用node-oracle连接到Oracle数据库。

当我从西里尔数据表中select数值时,一切都很好,但是如果我像这样调用一个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: 'те' } ] (该string被减半)。

数据库configuration如下:

 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.UTF8RUSSIAN_RUSSIA.AL32UTF8

我的configuration:
Mac OS X 10.9
Oracle客户端11.2
节点0.10.22
node-oracle 0.3.4

  1. 似乎现在不支持node-oracle UTF8编码,因为node.js支持本机编码( certificate )。

  2. 要正确处理string,您需要将客户端上的NLS_LANG参数设置为与数据库中相同的值(CL8MSWIN1251)

所以,你可以从2个变种中select:

A) 将数据库迁移到UTF8编码。

B)修补node-oracle源 ,在将内容返回给node.js并将其从UTF8转换为CL8MSWIN1251之前,将string和CLOB转换为UTF8 ,然后再将其传递给Oracle。 OCI接口具有这种转换的function 。 例如,为了您的本地目的,在utils.h修补OBJ_GET_STRINGmacros就足够了

PS node-oracle看起来非常简单,所以要准备好许多意外事件(例如,不支持BLOB和集合,缺less连接设置等等)。

这可能是因为您的数据库主字符集是CL8MSWIN1251,当本地设置指定UTF8时。

 NLS_CHARACTERSET CL8MSWIN1251 

variablesNLS_LANG指定如何解释您的本地环境

 NLS_LANG = language_territory.charset 

NLS_LANG的最后一部分提供了有关本地字符集的信息,它用于让Oracle知道您在客户端使用的字符集,因此Oracle可以进行正确的转换。 当来自双表的值的字符集未被正确识别时,可能来自表的值被适当地转换。

请尝试将NLS_LANGvariables设置为AMERICAN_AMERICA.CL8MSWIN1251(或RUSSIAN_RUSSIA.CL8MSWIN1251,这并不重要)

你确定你的源代码有UTF-8字符集吗?
如果只有硬编码符号的问题,可能您的Oracle开发GUI不支持UTF-8
我有特殊字符类似的问题,如在我的包和SQL *加特殊字符转换成一些不可读的