Набор символов Oracle ASCII - Расширения .Net - PullRequest
1 голос
/ 24 августа 2009

Я пытаюсь извлечь данные из таблицы Oracle. Столбец определен как char (40) и содержит расширенные значения ASCII. В настоящее время в SQL * Plus расширенные символы отображаются в виде перевернутого вопросительного знака. Мне нужно иметь возможность извлечь символы ASCII, которые имеют десятичное значение> 128 и отображаются в расширенной или 8-битной схеме кодирования.

- токовый выход

выберите myfield из Mytable;

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


- десятичные значения

Тип = 96 Лен = 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> select * from 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 AM

NLS_TIMESTAMP_FORMAT. DD-MON-RR ЧЧ.MI.SSXFF AM

NLS_TIME_TZ_FORMAT ЧЧ.MI.SSXFF AM TZR

NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR ЧЧ.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 ]

1 голос
/ 24 августа 2009

ваш 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

0 голосов
/ 17 ноября 2009

Нет ничего плохого, кроме дополнительного паратеза в конце.

Можно попробовать и эту функцию.

создать или заменить функцию str_ascii (pin in char), вернуть char - ret_val varchar2 (100); ch char (1); начать начать для n в петле длиной 1 .. если ret_val не равен NULL, ret_val: = ret_val || ','; конец если; ch: = substr (pin, n, 1); ret_val: = ret_val || ASCII (ч); концевой цикл; конец; return ret_val; конец;

Азиз

0 голосов
/ 24 августа 2009

У тебя проблема. Набор символов базы данных (NLS_CHARACTERSET) - US7ASCII. Это означает, что база данных поддерживает только 7-битные символы ASCII в столбцах CHAR. База данных не поддерживает использование каких-либо символов выше 128 на любой кодовой странице Windows, на которую вы ссылаетесь (я предполагаю, что Windows-1252, но есть много возможностей).

Сколько данных у вас в этой базе данных? Используется ли база данных другими приложениями? Эти приложения работают правильно?

В идеале вы сможете воссоздать базу данных с правильным набором символов (скорее всего, WE8MSWIN1252 или AL32UTF8), перезагрузить данные, и жизнь будет хорошей. Однако если у вас есть существующие приложения, которые работают, это будет означать, что у вас есть приложения, которые зависят от обхода кода преобразования набора символов в клиенте Oracle, что открывает совершенно другой источник боли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...