powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / dbms_crypto.hash() и CLOB с русскими буквами
3 сообщений из 3, страница 1 из 1
dbms_crypto.hash() и CLOB с русскими буквами
    #39309582
IL-84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Считаю MD5 от CLOB'a b и с русскими буквами выходит косяк:

Есть текстовый файл testfile.txt:

авторРУССКИЕ БУКВЫ
Считаем его контрольную сумму:

авторC:\>md5sum testfile.txt
f7fd776a51beb472e5d0306d46d805d7 *testfile.txt

А потом в pl/sql:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
DECLARE
    c1 CLOB;
    c2 BLOB;
    c3 BLOB;
    h1 VARCHAR2(100);
    h2 VARCHAR2(100);
    h3 VARCHAR2(100);
    
   l_dest_offset   integer := 1;
   l_source_offset integer := 1;
   l_lang_context  integer := DBMS_LOB.DEFAULT_LANG_CTX;
   l_warning       integer := DBMS_LOB.WARN_INCONVERTIBLE_CHAR;    
BEGIN
    c1 := to_clob('РУССКИЕ БУКВЫ');
    h1 := dbms_crypto.hash(c1, dbms_crypto.hash_md5);
    
    dbms_output.put_line(h1); -- 8C0D5123D7692F9A8913C4FB95061A6B
    
    c2 := to_blob(UTL_RAW.CAST_TO_RAW('РУССКИЕ БУКВЫ'));
    h2 := dbms_crypto.hash(c2, dbms_crypto.hash_md5);

    dbms_output.put_line(h2); -- F7FD776A51BEB472E5D0306D46D805D7

    dbms_lob.createtemporary(c3, TRUE);
    
    DBMS_LOB.CONVERTTOBLOB(c3, c1, DBMS_LOB.GETLENGTH(c1), l_dest_offset, l_source_offset, 0, l_lang_context, l_warning);
    h3 := dbms_crypto.hash(c3, dbms_crypto.hash_md5);

    dbms_output.put_line(h3); -- F7FD776A51BEB472E5D0306D46D805D7
END;  


Т.е. если посчитать MD5 от CLOB'a получается другой результат, а если брать BLOB, то в нем все ОК. Предполагаю что проблема в русских буквах и кодировке, но из-за чего и куда копать не понимаю.

NLS:
авторNLS_LANGUAGE RUSSIAN
NLS_TERRITORY RUSSIA
NLS_CURRENCY р.
NLS_ISO_CURRENCY RUSSIA
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT YYYY-MM-DD
NLS_DATE_LANGUAGE RUSSIAN
NLS_CHARACTERSET CL8MSWIN1251
NLS_SORT BINARY
NLS_TIME_FORMAT HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT YYYY-MM-DD HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT YYYY-MM-DD HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY р.
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
...
Рейтинг: 0 / 0
dbms_crypto.hash() и CLOB с русскими буквами
    #39309692
gpu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IL-84,
возможно>
dbms_crypto: required AL32UTF8 character set for VARCHAR2 encryption
...
Рейтинг: 0 / 0
dbms_crypto.hash() и CLOB с русскими буквами
    #39311203
IL-84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gpu, да в заголовке пакета dbms_crypto про это написано, спасибо.

dbms_crypto
-- Prior to encryption, hashing or keyed hashing, CLOB datatype is
-- converted to AL32UTF8. This allows cryptographic data to be
-- transferred and understood between databases with different
-- character sets, across character set changes and between
-- separate processes (for example, Java programs).
Буду конвертировать CLOB в BLOB и считать хеш.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / dbms_crypto.hash() и CLOB с русскими буквами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]