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

ws51t4hk  于 2023-06-22  发布在  Oracle
关注(0)|答案(3)|浏览(133)

我使用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;

然后从node调用:

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.UTF8RUSSIAN_RUSSIA.AL32UTF8,结果相同)
我的配置:
Mac OS X 10.9
Oracle客户端11.2
节点0.10.22
node-oracle 0.3.4

z3yyvxxp

z3yyvxxp1#

1.似乎目前在node-oracle中不支持UTF8以外的编码,因为node.js不支持本机编码(proof)。
1.要正确处理字符串,需要将客户端上的NLS_LANG参数设置为与数据库中相同的值(CL8MSWIN1251)
因此,您可以从2种变体中进行选择:
A)将数据库迁移到UTF8编码。
B)修补node-oracle source以将字符串和CLOB转换为UTF8,然后将其内容返回到node.js,并在将其传递给Oracle之前应用从UTF8CL8MSWIN1251的转换。OCI interface具有用于此类转换的函数。例如,对于您的本地目的,在utils.h中修补OBJ_GET_STRING宏就足够了
P.S. node-oracle目前看起来非常简单,所以要为许多惊喜做好准备(例如不支持BLOB和集合,缺少连接设置等)。

db2dz4w8

db2dz4w82#

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

NLS_CHARACTERSET    CL8MSWIN1251

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

NLS_LANG = language_territory.charset

NLS_LANG的最后一部分提供了关于本地字符集的信息,它用于让Oracle知道您在客户端使用的是什么字符集,以便Oracle可以进行适当的转换。当双表中的值的字符集没有被正确识别时,表中的值可能会被正确转换。
请尝试将NLS_LANG变量设置为AMERICAN_AMERICA.CL8MSWIN1251(或RUSSIAN_RUSSIA.CL8MSWIN1251,这并不重要)

m4pnthwp

m4pnthwp3#

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

相关问题