【问题标题】:Oracle ASCII Character Set - .Net ExtensionsOracle ASCII 字符集 - .Net 扩展
【发布时间】:2010-11-22 08:50:59
【问题描述】:

我正在尝试从 Oracle 表中提取数据。该列定义为 char(40) 并包含扩展的 ASCII 值。目前在 SQL*Plus 中,扩展字符显示为“倒置”问号。我需要能够提取十进制值 > 128 的 ASCII 字符并以扩展或 8 位编码模式显示。

-- 电流输出

从 Mytable 中选择 myfield;

b@¿pmxJ¿¿¿.¿¿¿P9¿¿¿¿¿+¿¿w)¿@Y@B¿¿¿


-- 十进制值

Typ=96 Len=40:
98,64,189,112,109,120,74,156,27,231,167,46,224,28,130,183,80,57,202,232,150,239,144,43,169,1,186,119,41,254,64,89,64,12,19,616,

-- 数据库字符集

SQL> 从 NLS_DATABASE_PARAMETERS 中选择 *;

参数值

------------------------------ ----- ------------------------------------

NLS_CSMIG_SCHEMA_VERSION 5

NLS_LANGUAGE 美国

NLS_TERRITORY 美国

NLS_CURRENCY $

NLS_ISO_CURRENCY 美国

NLS_NUMERIC_CHARACTERS .,

NLS_CHARACTERSET US7ASCII

NLS_CALENDAR 格雷戈里安

NLS_DATE_FORMAT DD-MON-RR

NLS_DATE_LANGUAGE 美国

NLS_SORT 二进制


参数值

------------------------------ ----- ------------------------------------

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 二进制

NLS_LENGTH_SEMANTICS 字节

NLS_NCHAR_CONV_EXCP 错误

NLS_NCHAR_CHARACTERSET UTF8

NLS_RDBMS_VERSION 10.2.0.3.0

我对 Oracle 没有太多经验。任何帮助将不胜感激!

谢谢, 布伦南


我能够提取十进制格式的数据并在 .Net 函数中处理它而没有问题。 SQL 语句有点乱。我正在尝试编写一个函数来协助查询。我在创建函数时遇到问题。

当前 SQL 语句:

select DECRYPTDATA(
    ASCII(SUBSTR(ACTIONCD,1,1)) || ',' ||
    ASCII(SUBSTR(ACTIONCD,2,1)) || ',' ||
    ASCII(SUBSTR(ACTIONCD,3,1)) || ',' ||
    ASCII(SUBSTR(ACTIONCD,4,1)) || ',' ||
    ASCII(SUBSTR(ACTIONCD,5,1)) || ',' ||
    ASCII(SUBSTR(ACTIONCD,6,1)) || ',' ||
    ASCII(SUBSTR(ACTIONCD,7,1)) || ',' ||
    ASCII(SUBSTR(ACTIONCD,8,1)) || ',' ||
    ASCII(SUBSTR(ACTIONCD,9,1)) || ',' ||
    ASCII(SUBSTR(ACTIONCD,10,1)) || ',' ||
    ASCII(SUBSTR(ACTIONCD,11,1)) || ',' ||
    ASCII(SUBSTR(ACTIONCD,12,1)) || ',' ||
    ASCII(SUBSTR(ACTIONCD,13,1)) || ',' ||
    ASCII(SUBSTR(ACTIONCD,14,1)) || ',' ||
    ASCII(SUBSTR(ACTIONCD,15,1)) || ',' ||
    ASCII(SUBSTR(ACTIONCD,16,1)), '1'  )
        from ORDERACTIONS where KEYNUM = 1

我想做一个快速函数来返回这个字符串。

下面是不会编译的函数。有什么建议吗?

create or replace function ASCIITODEC(p_actioncd VARCHAR2)
return VARCHAR2 is
begin

    return ASCII(SUBSTR(p_actioncd,1,1))  || ',' ||
           ASCII(SUBSTR(p_actioncd,2,1))  || ',' ||
           ASCII(SUBSTR(p_actioncd,3,1))  || ',' ||
           ASCII(SUBSTR(p_actioncd,4,1))  || ',' ||
           ASCII(SUBSTR(p_actioncd,5,1))  || ',' ||
           ASCII(SUBSTR(p_actioncd,6,1))  || ',' ||
           ASCII(SUBSTR(p_actioncd,7,1))  || ',' ||
           ASCII(SUBSTR(p_actioncd,8,1))  || ',' ||
           ASCII(SUBSTR(p_actioncd,9,1))  || ',' ||
           ASCII(SUBSTR(p_actioncd,10,1)) || ',' ||
           ASCII(SUBSTR(p_actioncd,11,1)) || ',' ||
           ASCII(SUBSTR(p_actioncd,12,1)) || ',' ||
           ASCII(SUBSTR(p_actioncd,13,1)) || ',' ||
           ASCII(SUBSTR(p_actioncd,14,1)) || ',' ||
           ASCII(SUBSTR(p_actioncd,15,1)) || ',' ||
           ASCII(SUBSTR(p_actioncd,16,1)) )

end ASCIITODEC;
/

谢谢, 布伦南

【问题讨论】:

标签: c# .net oracle


【解决方案1】:

您的 NLS_CHARACTERSET 定义为:

NLS_CHARACTERSET US7ASCII 

因此,oracle 将只保证可以存储标准的 ASCII 字符 你必须要么

  • 将您的数据库字符集更改为允许扩展字符的内容,例如:UTF-8

  • 将字段从 CHAR 更改为 NCHAR。 NCHAR 列将获取 NLS_NCHAR CHARACTERSET,我可以看到它设置为 UTF-8。

另外,您确定要使用 CHAR 而不是 VARCHAR? CHAR 字段被填充为始终为 40 个字符长。 NVARCHAR 是最长 40 个字符的字段。

话虽如此,如果您确实设法将非 ascii 字符填充到 US7ASCII 字段中,则有时可以将数据库字符集转换为类似 WE8ISO8859P1 的字符集。 见

http://download.oracle.com/docs/cd/B10501_01/server.920/a96529/ch2.htm#101203

【讨论】:

  • 您好,
    感谢您的快速响应。有没有办法使用 Oracle 函数“即时”转换字符。我将无法转换数据库。
    谢谢,布伦南
  • CONVERT(field_name, 'WE8ISO8859P1', 'US7ASCII') 可能有效。但归根结底,如果您不更改数据库字符集或切换到使用 NCHAR,那么您将处于不受支持的领域
【解决方案2】:

除了最后多了一个括号外没有错。

也可以试试这个功能。

创建或替换函数 str_ascii(pin in char) return char is ret_val varchar2(100); ch 字符(1); 开始 开始 for n in 1 .. 长度(引脚)循环 如果 ret_val 不为空,则 ret_val := ret_val ||', '; 万一; ch := substr(pin,n,1); ret_val := ret_val || ascii(ch); 结束循环; 结尾; 返回 ret_val; 结束;

阿齐兹

【讨论】:

  • 代码以适当的缩进方式输入,但它在此处以连续格式显示。无论如何,您可以在之后按回车键;使可读
【解决方案3】:

你有问题。数据库字符集 (NLS_CHARACTERSET) 是 US7ASCII。这意味着数据库仅支持 CHAR 列中的 7 位 ASCII 字符。该数据库不支持在您所指的任何 Windows 代码页上使用 128 以上的任何字符(我猜是 Windows-1252,但有很多可能性)。

您在这个数据库中有多少数据?数据库是否被其他应用程序使用?这些应用程序是否正常工作?

理想情况下,您将能够使用适当的字符集(最有可能是 WE8MSWIN1252 或 AL32UTF8)重新创建数据库,重新加载数据,然后生活会很好。但是,如果您现有的应用程序似乎可以工作,这表明您的应用程序依赖于绕过 Oracle 客户端中的字符集转换代码,这会带来另一个痛苦的根源。

【讨论】:

  • 您好 Justin,数据库中有数百万条记录,并且有与数据库交互的主要 ERP 系统。有没有办法从列中传递十进制值?我只需要访问前 20 个职位。 ASCII(SUBSTR(MYCOL,1,1) + ',' + SUBSTR(MYCOL,2,1)....谢谢,布伦南
猜你喜欢
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 2013-03-19
  • 1970-01-01
  • 2010-09-18
  • 2022-01-14
  • 1970-01-01
相关资源
最近更新 更多