Oracle ASCII字符集 - .Net扩展

时间:2009-08-24 17:59:51

标签: c# .net oracle

我正在尝试从Oracle表中提取数据。该列定义为char(40)并包含扩展的ASCII值。目前在SQL * Plus中,扩展字符显示为“颠倒”问号。我需要能够提取具有小数值>的ASCII字符。 128并以扩展或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,8,66,194,136,210  

- 数据库字符集

SQL>从NLS_DATABASE_PARAMETERS中选择*;

参数值
 

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

NLS_CSMIG_SCHEMA_VERSION 5

NLS_LANGUAGE AMERICAN

NLS_TERRITORY AMERICA

NLS_CURRENCY $

NLS_ISO_CURRENCY AMERICA

NLS_NUMERIC_CHARACTERS。,

NLS_CHARACTERSET US7ASCII

NLS_CALENDAR GREGORIAN

NLS_DATE_FORMAT DD-MON-RR

NLS_DATE_LANGUAGE AMERICAN

NLS_SORT BINARY


参数值

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

NLS_TIME_FORMAT HH.MI.SSXFF上午

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 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;
/

谢谢, 布伦南

3 个答案:

答案 0 :(得分:1)

您的NLS_CHARACTERSET定义为:

NLS_CHARACTERSET US7ASCII 

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

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

OR

  • 将字段从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

答案 1 :(得分:0)

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

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

理想情况下,您可以使用正确的字符集(最有可能是WE8MSWIN1252或AL32UTF8)重新创建数据库,重新加载数据,生活会很好。但是,如果现有的应用程序似乎有效,则表明您的应用程序依赖于绕过Oracle客户端中的字符集转换代码,从而打开了另一个痛苦的来源。

答案 2 :(得分:0)

除了onc额外的paranthesis之外没有任何错误。

也可以尝试这个功能。

创建或替换函数str_ascii(pin in char)返回char是 ret_val varchar2(100); ch char(1); 开始   开始     for n in 1 .. length(pin)loop       如果ret_val不为null则          ret_val:= ret_val ||',';       万一;       ch:= substr(pin,n,1);       ret_val:= ret_val || ASCII(CH);     结束循环;   结束;   return ret_val; 端;

阿齐兹

相关问题