首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用node-oracle将硬编码的字符串一分为二

使用node-oracle将硬编码的字符串一分为二
EN

Stack Overflow用户
提问于 2013-11-19 16:55:07
回答 3查看 1.1K关注 0票数 6

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

当我从包含cyrillic数据的表中选择值时,一切都很好,但是如果我像这样调用procudure:

代码语言:javascript
复制
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;

然后从节点调用它:

代码语言:javascript
复制
connection.execute("call TEST_ENCODING(:1)", [new oracle.OutParam(oracle.OCCICURSOR)],
  function (err, result) {
    console.log(result)
  }
);

结果是:[ { HELLO: 'те' } ](字符串被切成两半)。

数据库配置如下:

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

发布于 2013-11-25 23:33:53

  1. 目前似乎不支持UTF8以外的编码,因为node-oracle不支持原生编码(proof).
  2. To处理字符串,您需要将客户端上的NLS_LANG参数设置为与数据库(CL8MSWIN1251)

中相同的值

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

A) Migrate databaseUTF8编码。

B)对node-oracle source打补丁,以便在将内容返回到node.js之前将字符串和CLOB转换为UTF8,并在将其传递给Oracle之前应用从UTF8CL8MSWIN1251的转换。对于这样的转换,OCI interface有一个functions。例如,对于您的本地用途,在utils.h中修补OBJ_GET_STRING宏就足够了

P.S. node-oracle目前看起来非常简单,所以要准备好迎接许多惊喜(例如,不支持BLOB和集合,缺乏连接设置等)。

票数 1
EN

Stack Overflow用户

发布于 2013-11-22 15:20:13

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

代码语言:javascript
复制
NLS_CHARACTERSET    CL8MSWIN1251

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

代码语言:javascript
复制
NLS_LANG = language_territory.charset

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

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

票数 0
EN

Stack Overflow用户

发布于 2013-11-26 02:37:30

您确定您的源代码有UTF-8字符集吗?

如果只存在硬编码符号问题,则可能是Oracle开发的GUI不支持UTF-8

我在包中的特殊字符和sql*中的特殊字符也有类似的问题,这些特殊字符将特殊字符转换为一些不可读的字符

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20067044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档