Oracle raw类型
RAW(size):长度为size字节的原始二进制数据,size的最大值为2000字节;
RAW类型好处:在网络中的计算机之间传输 RAW 数据时,或者使用 Oracle 实用程序将 RAW 数据从一个数据库移到另一个数据库时,Oracle 服务器不执行字符集转换。
RAW,类似于CHAR,声明方式RAW(L),L为长度,以字节为单位,作为数据库列最大2000,作为变量最大32767字节。
LONG RAW,类似于LONG,作为数据库列最大存储2G字节的数据,作为变量最大32760字节; 操作:
create table raw_test (id number, raw_date raw(10));
insert into raw_test values (1, hextoraw('ff'));
insert into raw_test values (2,UTL_RAW.cast_to_raw('abc'));
insert into raw_test values (3,UTL_RAW.cast_to_raw('你好你你的'));
SELECT r.*,DUMP(r.raw_date),RAWTOHEX(r.raw_date),UTL_RAW.CAST_TO_VARCHAR2(r.raw_date) FROM raw_test r;
-----------------------------------------------------------------------------
ID RAW_DATE DUMP(R.RAW_DATE) RAWTOHEX(R.RAW_DATE) UTL_RAW.CAST_TO_VARCHAR2(R.RAW
1 FF Typ=23 Len=1: 255 FF
2 616263 Typ=23 Len=3: 97,98,99 616263 abc
3 C4E3BAC3C4E3C4E3B5C4 Typ=23 Len=10: 196,227,186,195,196,227,196,227,181,196 C4E3BAC3C4E3C4E3B5C4 你好你你的
这里用到了几个函数:
1. UTL_RAW.CAST_TO_RAW:该函数按照缺省字符集(一般为GB2312),将VARCHAR2字符串转换为RAW,直接把字符串中每个字符的ASCII码存放到RAW类型的字段中。
2.UTL_RAW.CAST_TO_VARCHAR2:该函数按照缺省字符集合(一般为GB2312),将RAW转换为VARCHAR2。
3.HEXTORAW(string):当使用HEXTORAW时,会把字符串中数据当作16进制数,String中的每两个字符表示了结果RAW中的一个字节。
4.RAWTOHEX(rawvalue):将RAW类数值rawvalue转换为一个相应的十六进制表示的字符串. rawvalue中的每个字节都被转换为一个双字节的字符串. RAWTOHEX和HEXTORAW是两个相反的函数.
当使用HEXTORAW时,会把字符串中数据当作16进制数。
而使用UTL_RAW.CAST_TO_RAW时,直接把字符串中每个字符的ASCII码存放到RAW类型的字段中.
其实RAW和VARCHAR是类似的,只是存储在RAW里的是二进制值,在任何时候不会做自动的字符集转换,这是RAW和VARCHAR的不同,RAW只是一种外部类型,其内部存储是VARRAW;
VARCHAR的Oracle内部定义是:struct { ub2 len; char arr[n] }
VARRAW的ORACLE内部定义是: struct { ub2 len; unsigned char arr[n] }
补充:
hextoraw():十六进制字符串转换为raw;16进制不能超过F
sys@XXX> select hextoraw('abcdef') from dual;
HEXTOR
------
ABCDEF
错误结果:
sys@XXX> select hextoraw('G') from dual;
select hextoraw('G') from dual
*
ERROR at line 1:
ORA-01465: invalid hex number
--把字符串“A”当作16进制,就是0x0A,这就算转成raw了;
为了显示出来给你看,所以又转化成16进制,就是字符串“0A”
SYS@xxx> SELECT hextoraw('A') FROM dual;
HE
--
0A
rawtohex():将raw串转换为十六进制;
sys@ORCL> select rawtohex('aa') from dual;
RAWT
----
6161
--ASCII码值转换字符
SYS@XXX> SELECT CHR('') FROM DUAL;
C
-
a
--字符转换ASCII码值
SYS@XXX> SELECT ASCII('a') FROM DUAL;
ASCII('A')
----------
97
--十转换16进制
SYS@XXX> select to_char('','XXX') from dual;
TO_C
----
61
--16进制转换成十进制
SYS@XXX> SELECT to_number('','XX') FROM dual;
TO_NUMBER('','XX')
--------------------
97
结果之所以是6161是因为a的ASCII为97,65转换为十六进制就是41。
SQL> select rawtohex(sysdate) from dual;
07D70B100A003100
SQL> select dump(sysdate,16) from dual;
Typ=13 Len=8: 7,d7,b,10,a,1,2,0
SQL> select rawtohex(12) from dual;
C10D
SQL> select dump(12,16) from dual;
Typ=2 Len=2: c1,d
SQL> select rawtohex('') from dual;
3132
SQL> select dump('',16) from dual;
Typ=96 Len=2: 31,32
可以看出rawtohex()函数参数可为date,number,char等类型,并自动转化为相应16进制数据.
特殊情况:
sys@XXX> declare
a varchar2(100);
begin
select rawtohex('aa') into a from dual;
dbms_output.put_line(a);
end;
/
6161
PL/SQL procedure successfully completed. sys@XXX>
declare
a varchar2(100);
begin
a:=rawtohex('aa');
dbms_output.put_line(a);
end;
/
AA
PL/SQL procedure successfully completed.
原因在于:SELECT方法用的是SQL 引擎,而:=是用PL/SQL 引擎;
本例两个调用中给的参数都是CHAR类型,这时ORACLE要进行缺省的类型转换,把'aa'由CHAR转到RAW。
但是SQL引擎和PL/SQL引擎的这个类型转换却不一样,SQL引擎使用了utl_raw.cast_to_raw,所以最后结果是'6161',PL/SQL使用了HEXTORAW。
因此在用到rawtohex()函数时,不应该给它自动类型转换的机会,因为这是最容易出错的。
如果你期待的结果是'6161'就该这样写:rawtohex(utl_raw.cast_to_raw('aa'))
如果你期待的结果是'AA'就该这样写:rawtohex(hextoraw('aa'))
不管哪个引擎都不会错了。
| ASCII 码 | 字符 | ASCII 码 | 字符 | ASCII 码 | 字符 | ASCII 码 | 字符 | |||||||
| 十进位 | 十六进位 | 十进位 | 十六进位 | 十进位 | 十六进位 | 十进位 | 十六进位 | |||||||
| 032 | 20 | 056 | 38 | 8 | 080 | 50 | P | 104 | 68 | h | ||||
| 033 | 21 | ! | 057 | 39 | 9 | 081 | 51 | Q | 105 | 69 | i | |||
| 034 | 22 | " | 058 | 3A | : | 082 | 52 | R | 106 | 6A | j | |||
| 035 | 23 | # | 059 | 3B | ; | 083 | 53 | S | 107 | 6B | k | |||
| 036 | 24 | $ | 060 | 3C | < | 084 | 54 | T | 108 | 6C | l | |||
| 037 | 25 | % | 061 | 3D | = | 085 | 55 | U | 109 | 6D | m | |||
| 038 | 26 | & | 062 | 3E | > | 086 | 56 | V | 110 | 6E | n | |||
| 039 | 27 | ' | 063 | 3F | ? | 087 | 57 | W | 111 | 6F | o | |||
| 040 | 28 | ( | 064 | 40 | @ | 088 | 58 | X | 112 | 70 | p | |||
| 041 | 29 | ) | 065 | 41 | A | 089 | 59 | Y | 113 | 71 | q | |||
| 042 | 2A | * | 066 | 42 | B | 090 | 5A | Z | 114 | 72 | r | |||
| 043 | 2B | + | 067 | 43 | C | 091 | 5B | [ | 115 | 73 | s | |||
| 044 | 2C | , | 068 | 44 | D | 092 | 5C | \ | 116 | 74 | t | |||
| 045 | 2D | - | 069 | 45 | E | 093 | 5D | ] | 117 | 75 | u | |||
| 046 | 2E | . | 070 | 46 | F | 094 | 5E | ^ | 118 | 76 | v | |||
| 047 | 2F | / | 071 | 47 | G | 095 | 5F | _ | 119 | 77 | w | |||
| 048 | 30 | 0 | 072 | 48 | H | 096 | 60 | ` | 120 | 78 | x | |||
| 049 | 31 | 1 | 073 | 49 | I | 097 | 61 | a | 121 | 79 | y | |||
| 050 | 32 | 2 | 074 | 4A | J | 098 | 62 | b | 122 | 7A | z | |||
| 051 | 33 | 3 | 075 | 4B | K | 099 | 63 | c | 123 | 7B | { | |||
| 052 | 34 | 4 | 076 | 4C | L | 100 | 64 | d | 124 | 7C | | | |||
| 053 | 35 | 5 | 077 | 4D | M | 101 | 65 | e | 125 | 7D | } | |||
| 054 | 36 | 6 | 078 | 4E | N | 102 | 66 | f | 126 | 7E | ~ | |||
| 055 | 37 | 7 | 079 | 4F | O | 103 | 67 | g | 127 | 7F | ||||
Oracle raw类型的更多相关文章
- [20190930]oracle raw类型转化number脚本.txt
[20190930]oracle raw类型转化number脚本.txt --//写一个简单oracle raw转化number脚本,简单说明:--//输入必须是c1,02 或者 c102,不支持c1 ...
- oracle字段类型
oracle 字段类型CHAR 固定长度字符串 最大长度2000 bytes VARCHAR2 可变长度的字符串 最大长度4000 byt ...
- oracle 字段类型详解
CHAR 固定长度字符串 最大长度2000 bytes VARCHAR2 可变长度的字符串 最大长度4000 bytes 可做索引的最大长度749 NCHAR 根据字符集而定的固定长度字符串 最大长度 ...
- Oracle数据库类型
Oracle数据库类型 字符类型char[(length)] 定长字符 最长2000字节varchar2[(length)] 可变长度的字符数据类型,最长4000字节NCHAR[(length)] 固 ...
- Oracle字段类型及存储(一)
Oracle中2000个byte,并不是2000个字符的意思,1个字符在Oracle中可能是1个byte到4个byte不等,需看数据库字符集的设置了. 对GBK字符集而言,ASCII码中128个字符使 ...
- Oracle raw数据类型
RAW的声明方式为RAW(L),L为长度,以字节为单位,它存数的是16进制的数据.作为数据库列最大2000,作为变量最大32767字节. RAW类型的好处就是:在网络中的计算机之间传输 RAW 数据时 ...
- Oracle数据库类型总结
RACLE基本数据类型(亦叫内置数据类型 built-in datatypes)可以按类型分为:字符串类型.数字类型.日期类型.LOB类型.LONG RAW& RAW类型.ROWID & ...
- Oracle 字段类型
Oracle 字段类型 http://www.cnblogs.com/lihan/archive/2010/01/06/1640547.html 字段类型 描述 字段长度及其缺省值 CHAR (siz ...
- [20191013]oracle number类型存储转化脚本.txt
[20191013]oracle number类型存储转化脚本.txt --//测试看看是否可以利用bc obase=100的输出解决问题.另外以前脚本忘记考虑尾数的四舍五入问题.--//也许编程就是 ...
随机推荐
- js随机数算法
function rnd( seed ){ seed = ( seed * 9301 + 49297 ) % 233280; //为何使用这三个数? return seed / ( 233280.0 ...
- php性能优化--opcache
一.OPcache是什么? OPcache通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销. PHP 5 ...
- “Hello world!”团队第一周贡献分分配结果
小组名称:Hello World! 项目名称:空天猎 组长:陈建宇 成员:刘成志.阚博文.刘淑霞.黄泽宇.方铭.贾男男 第一周贡献分分配结果 基础分 会议分 提功能分 个人表现分 各项总分 最终分 ...
- M2功能规格说明书
1.目的: 这篇随笔是简述我们团队所做的工程所能实现的功能及方便用户的使用. 2.假定和约束: 我们先限定为本地连接数据库进行各种操作的实现.用户电脑中需要有FLASH工具及快播插件.其他只需要了解基 ...
- oracle数据库之PL/SQL 流程控制语句
介绍 PL/SQL 的流程控制语句, 包括如下三类: 1.控制语句: IF 语句 2.循环语句: LOOP 语句, EXIT 语句 3.顺序语句: GOTO 语句, NULL 语句 一 条件语句 IF ...
- kmeans算法理解及代码实现
github:kmeans代码实现1.kmeans代码实现2(包含二分k-means) 本文算法均使用python3实现 1 聚类算法 对于"监督学习"(supervised ...
- Swift-枚举enum理解
//定义一个枚举 //枚举的语法,enum开头,每一行成员的定义使用case关键字开头,一行可以定义多个关键字 enum CompassPoint { case North case South ca ...
- 【APS.NET Core】- Razor Page 使用jqgrid实现分页功能
本文将使用jqgrid在Razor Page中实现分页功能. 前台 List.cshtml代码如下: @page @model ListModel @{ Layout = "~/Pages/ ...
- windows下apache+php安装
1.安装apache 通过exe安装,如果80端口被占用,修改httpd.conf中的Listen,然后再次用exe安装,选择repaire 2.安装php 解压php包,添加系统变量 path,加上 ...
- Agile.Net 组件式开发平台 - 服务开发示例
在上一篇文章中已经讲解了组件的开发,这篇文章讲解平台服务开发. Agile.Net开发管理平台项目,已经托管在开源中国码云平台(http://git.oschina.net) 登陆码云平台进入项目主页 ...