原文链接:https://www.modb.pro/db/23307?xy

摘要:描述Oracle的RAW类型存储格式

和其他数据类型相比,RAW类型的存储显得直观多了,它和SELECT时数据展示的值完全一样。(SELECT时是按照16进制展示的)

SQL>createtabletest_raw(idnumber,raw_dateraw(10));表已创建。SQL>insertintotest_rawvalues(1,hextoraw('ff'));已创建1行。SQL>droptabletest_raw;表已丢弃。SQL>createtabletest_raw(raw_colraw(10));表已创建。SQL>insertintotest_rawvalues(hextoraw('ff'));已创建1行。SQL>insertintotest_rawvalues(hextoraw('0'));已创建1行。SQL>insertintotest_rawvalues(hextoraw('23fc'));已创建1行。SQL>insertintotest_rawvalues(hextoraw('fffffffffff'));已创建1行。SQL>insertintotest_rawvalues(hextoraw('ffffffffffffffffffff'));已创建1行。SQL>insertintotest_rawvalues(utl_raw.cast_to_raw('051'));已创建1行。SQL>selectraw_col,dump(raw_col,16)dump_rawfromtest_raw;RAW_COLDUMP_RAW-------------------------------------------------------------------FFTyp=23Len=1:ff00Typ=23Len=1:023FCTyp=23Len=2:23,fc0FFFFFFFFFFFTyp=23Len=6:f,ff,ff,ff,ff,ffFFFFFFFFFFFFFFFFFFFFTyp=23Len=10:ff,ff,ff,ff,ff,ff,ff,ff,ff,ff303531Typ=23Len=3:30,35,31已选择6行。

RAW类型的存储很简单,对比字段的查询结果和DUMP的结果就一目了然了。
需要注意的是,两种转化为RAW的函数之间的差别。当使用HEXTORAW时,会把字符串中数据当作16进制数。而使用UTL_RAW.CAST_TO_RAW时,直接把字符串中每个字符的ASCII码存放到RAW类型的字段中。

SQL>insertintotest_rawvalues('gg');insertintotest_rawvalues('gg')*ERROR位于第1行:ORA-01465:无效的十六进制数字SQL>insertintotest_rawvalues(hextoraw('gg'));insertintotest_rawvalues(hextoraw('gg'))*ERROR位于第1行:ORA-01465:无效的十六进制数字SQL>insertintotest_rawvalues(utl_raw.cast_to_raw('gg'));已创建1行。SQL>selectraw_col,dump(raw_col,16)dump_rawfromtest_raw;RAW_COLDUMP_RAW------------------------------------------------------------------FFTyp=23Len=1:ff00Typ=23Len=1:023FCTyp=23Len=2:23,fc6767Typ=23Len=2:67,670FFFFFFFFFFFTyp=23Len=6:f,ff,ff,ff,ff,ffFFFFFFFFFFFFFFFFFFFFTyp=23Len=10:ff,ff,ff,ff,ff,ff,ff,ff,ff,ff303531Typ=23Len=3:30,35,31已选择7行。