6

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

当我从带有西里尔数据的表中选择值时,一切都很好,但是如果我这样调用程序:

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
node 0.10.22
node-oracle 0.3.4

4

3 回答 3

1
  1. 似乎目前不支持其他编码UTF8node-oracle因为不node.js支持本机编码(证明)。

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

因此,您可以从 2 种变体中进行选择:

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

B)将字符串和 CLOB 转换为的补丁node-oracleUTF8,然后将其内容返回给 node.js,并在将其传递给 Oracle 之前应用转换 from UTF8to 。OCI 接口具有用于此类转换的功能。例如,为了您的本地目的,修补宏就足够了CL8MSWIN1251OBJ_GET_STRINGutils.h

PSnode-oracle目前看起来非常简单,所以要为许多惊喜做好准备(例如不支持 BLOB 和集合、缺少连接设置等)。

于 2013-11-25T15:33:52.723 回答
0

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

NLS_CHARACTERSET    CL8MSWIN1251

变量 NLS_LANG 指定如何解释本地环境

NLS_LANG = language_territory.charset

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

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

于 2013-11-22T07:20:12.783 回答
0

你确定你的源代码有 UTF-8 字符集吗?
如果问题仅与硬编码符号有关,那么您用于 Oracle 开发的 GUI 不支持 UTF-8
我在包中的特殊字符(如 ¥)和将特殊字符转换为一些不可读的 sql*plus 时遇到类似问题

于 2013-11-25T18:37:30.337 回答