使用node-oracle将硬编码字符串切成两半

F0R*_*0RR 6 oracle node.js node-oracle

我使用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;
Run Code Online (Sandbox Code Playgroud)

然后从节点调用它:

connection.execute("call TEST_ENCODING(:1)", [new oracle.OutParam(oracle.OCCICURSOR)],
  function (err, result) {
    console.log(result)
  }
);
Run Code Online (Sandbox Code Playgroud)

结果是:( [ { 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
Run Code Online (Sandbox Code Playgroud)

在我的本地环境中:( 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

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

NLS_CHARACTERSET    CL8MSWIN1251
Run Code Online (Sandbox Code Playgroud)

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

NLS_LANG = language_territory.charset
Run Code Online (Sandbox Code Playgroud)

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

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