oracle casttoraw,HEXTORAW、utl_raw.cast_to_raw、RAWTOHEX一点认识

本文探讨了Oracle数据库中的RAW可变长度二进制类型,以及HEXTORAW和RAWTOHEX函数的使用,通过实例解析了16进制到RAW和RAW到16进制的转换过程,适合数据库开发者和高级SQL用户参考。
摘要由CSDN通过智能技术生成

RAW 可变长度二进制类型,不受字符集的影响,目前已被LOB类型替代,结构非常像VARCHAR2,做为COLUMN 最大2000字节,做为变量32767个字节

HEXTORAW

把16进制转为RAW,该参数是把传入的字符串直接当16进制字符,如果不是有效字符会报错

utl_raw.cast_to_raw 则不同于上面,会转换为传入的字符串的每一个字符的ASCII码的16进制

RAWTOHEX

它是HEXTORAW的反向操作,把RAW转换为16进制,如果传入的是字符串,那返回的也是字符串的每个字符的ASCII码的16进制

下面看我几个例子就明白了

先看一下16进制和10进制的简单转换

SQL> select to_char('10','xxxxx') from dual;

TO_CHAR('10','XXXX

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

a

SQL> select to_number('10','xxxxx') from dual;

TO_NUMBER('10','XXXXX')

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

16

SQL> drop table testraw purge;

Table dropped.

SQL> create table testraw (id int,value raw(10));

Table created.

SQL> select hextoraw('10') from dual;

HE

--

10

SQL> select hextoraw('1') from dual;

HE

--

01

SQL> select hextoraw('a') from dual;

HE

--

0A

SQL> select hextoraw('g') from dual;

select hextoraw('g') from dual

*

ERROR at line 1:

ORA-01465: invalid hex number

SQL> insert into testraw values(1,hextoraw(1));

1 row created.

SQL> insert into testraw values(2,hextoraw('f'));

1 row created.

SQL> insert into testraw values(3,hextoraw('10'));

1 row created.

SQL> commit;

Commit complete.

SQL> select value, rawtohex(value) raw2hex,dump(value,16) dump16,to_number(value,'xxxxxx') hexto10 from testraw;

VALUE RAW2HEX DUMP16 HEXTO10

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

01 01 Typ=23 Len=1: 1 1

0F 0F Typ=23 Len=1: f 15

10 10 Typ=23 Len=1: 10 16

SQL> select rawtohex('01a') from dual;

RAWTOHEX('01A')

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

303161

SQL> select to_number(30,'xxxx') from dual;

TO_NUMBER(30,'XXXX')

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

48

SQL> select ascii(0) from dual;

ASCII(0)

----------

48

SQL> select to_number('A','xxxx') from dual;

TO_NUMBER('A','XXXX')

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

10

SQL> select to_number(61,'xxxx') from dual;

TO_NUMBER(61,'XXXX')

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

97

SQL> select chr(97) from dual;

CHR

---

a

SQL> insert into testraw values(4,UTL_RAW.CAST_TO_RAW('01a'));

1 row created.

SQL> select * from testraw;

ID VALUE

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

1 01

2 0F

3 10

4 303161

SQL> select value,dump(value,16) dump16 from testraw;

VALUE DUMP16

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

01 Typ=23 Len=1: 1

0F Typ=23 Len=1: f

10 Typ=23 Len=1: 10

303161 Typ=23 Len=3: 30,31,61

打赏

8732971891f4ba05583674ca6b8145ac.png微信扫一扫,打赏作者吧~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
grant execute on dbms_crypto to system; declare input_string VARCHAR2 (200) := 'Secret Message'; output_string VARCHAR2(2000); encrypted_raw RAW(2000); decrypted_raw RAW(2000); num_key_bytes NUMBER := 256/8; key_bytes_raw RAW(32); encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; begin DBMS_OUTPUT.PUT_LINE(input_string); key_bytes_raw := DBMS_CRYPTO.RANDOMBYTES(num_key_bytes); encrypted_raw := DBMS_CRYPTO.ENCRYPT ( src => UTL_I18N.STRING_TO_RAW(input_string, 'AL32UTF8'), typ => encryption_type, key => key_bytes_raw ); decrypted_raw := DBMS_CRYPTO.DECRYPT ( src => encrypted_raw, typ => encryption_type, key => key_bytes_raw ); output_string := UTL_I18N.RAW_TO_CHAR(decrypted_raw, 'AL32UTF8'); DBMS_OUTPUT.PUT_LINE(output_string); end; declare l_src_data varchar2(20); l_type pls_integer :=DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; l_key varchar2(20) :='0123456789123456'; l_encval raw(2000); CURSOR secret_cursor IS select phonenumber from customer; begin OPEN secret_cursor; LOOP FETCH secret_cursor INTO l_src_data; l_encval :=dbms_crypto.encrypt( src=>utl_i18n.string_to_raw(l_src_data,'AL32UTF8'), typ=>l_type, key=>utl_i18n.string_to_raw(l_key,'AL32UTF8')); DBMS_OUTPUT.PUT_LINE (l_encval); EXIT WHEN secret_cursor%NOTFOUND; END LOOP; CLOSE secret_cursor; end; declare ;_src_data row(100) :=hextoraw("190248129038903853275ijdkvjkad'); l_type pls_integer :=dbms_crypto.encrypt_aes128+ + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; l_key varchar2(20) :='0123456789123456'; l_decval raw(200); begin l_decval :=dbms_crypto.decrypt( src=>l_src_data, typ=>l_type, key=>utl_i18n.string_to_raw(l_key,'AL32UTF8')); end; SELECT Price FROM PRODUCT WHERE ProductID = 5;修正这一段代码
05-26
以下是修正后的代码: ``` grant execute on dbms_crypto to system; -- 第一个代码块 declare input_string VARCHAR2 (200) := 'Secret Message'; output_string VARCHAR2(2000); encrypted_raw RAW(2000); decrypted_raw RAW(2000); num_key_bytes NUMBER := 256/8; key_bytes_raw RAW(32); encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; begin DBMS_OUTPUT.PUT_LINE(input_string); key_bytes_raw := DBMS_CRYPTO.RANDOMBYTES(num_key_bytes); encrypted_raw := DBMS_CRYPTO.ENCRYPT(src => UTL_I18N.STRING_TO_RAW(input_string, 'AL32UTF8'), typ => encryption_type, key => key_bytes_raw); decrypted_raw := DBMS_CRYPTO.DECRYPT(src => encrypted_raw, typ => encryption_type, key => key_bytes_raw); output_string := UTL_I18N.RAW_TO_CHAR(decrypted_raw, 'AL32UTF8'); DBMS_OUTPUT.PUT_LINE(output_string); end; -- 第二个代码块 declare l_src_data varchar2(20); l_type pls_integer := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; l_key varchar2(20) := '0123456789123456'; l_encval raw(2000); cursor secret_cursor is select phonenumber from customer; begin open secret_cursor; loop fetch secret_cursor into l_src_data; exit when secret_cursor%notfound; l_encval := dbms_crypto.encrypt(src => utl_i18n.string_to_raw(l_src_data,'AL32UTF8'), typ => l_type, key => utl_i18n.string_to_raw(l_key,'AL32UTF8')); dbms_output.put_line(l_encval); end loop; close secret_cursor; end; -- 第三个代码块 declare l_src_data raw(100) := hextoraw('190248129038903853275ijdkvjkad'); l_type pls_integer := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; l_key varchar2(20) := '0123456789123456'; l_decval raw(200); begin l_decval := dbms_crypto.decrypt(src => l_src_data, typ => l_type, key => utl_i18n.string_to_raw(l_key,'AL32UTF8')); end; -- SQL 查询语句 SELECT Price FROM PRODUCT WHERE ProductID = 5; ``` 注意:第三个代码块中的 `l_src_data` 变量的赋值语句中,修正了单引号和双引号的不匹配问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值