mysql与oracle之间的数据类型转换⼀、常见数据类型在MySQL与Oracle数据库中的表现形式
说明mysql oracle
变长字符串VARCHAR[0-65535]
定义长度默认按字符长度计
算,如果是GBK编码的汉字将
占⽤2个字节
VARCHAR2[1-4000]
VARCHAR是VARCHAR2的同义词
定义默认按字节长度计算
整数TINYINT(-128-127)
SMALLINT(-32768-32767)
MEDIUMINT(-8388608-
8388607)
INT(-2147483648-
2147483647)
BIGINT(-
9223372036854775808-
9223372036854775807)
⽆专⽤类型,
TINYINT可以⽤NUMBER(3,0)代替
SMALLINT可以⽤NUMBER(5,0)代替
MEDUIMINT可以⽤NUMBER(7,0)代替
INT可以⽤NUMBER(10,0)代替
BIGINT可以⽤NUMBER(20,0)代替
ORACLE中有
SMALLINT,INT,INTEGER类型,不过
这是NUMBER(38,0)的同义词
数值类型DECIMAL[1-65[,0-30]]
NUMERIC是DECIMAL的同义
词
NUMBER 可表⽰数范围: 1*10^-130
⾄1*10^126
NUMBER([1-38][,-84-127])
DECIMAL、NUMERIC、DEC是
NUMBER的同义词
浮点型FLOAT(D,M)oracle10g开始增加BINARY_FLOAT类型
10g以前⽆专⽤类型,可以⽤NUMBER 代替
ORACLE中有FLOAT和REAL类型,不过这是NUMBER的同义词
双精度浮点型DOUBLE(D,M)oracle10g开始增加BINARY_DOUBLE 类型
10g以前⽆专⽤类型,可以⽤NUMBER 代替
ORACLE中有DOUBLE PRECISION 类型,不过这是NUMBER的同义词
位类型BIT(1-64)⽆
⽇期类型DATE,3字节存储,只存储⽇
期,没有时间,⽀持范围是
[1000-01-01]⾄[9999-12-31]
TIME,3字节存储,只存储时
间,没有⽇期,⽀持范围是[-
838:59:59]⾄[838:59:59]
DATETIME,占8字节存储,可
表⽰⽇期和时间,⽀持范围是
[1000-01-01 00:00:00]⾄[9999-
12-31 23:59:59]
TIMESTAMP,占4字节存储,
可表⽰⽇期和时间,范围是
DATE类型
7字节存储,可表⽰⽇期和时间,⽀持
范围是[-4712-01-01 00:00:00]⾄[9999-
12-31 23:59:59]
可表⽰⽇期和时间,范围是[1970-01-01 00:00:00]⾄[2038-01-19 03:14:07]
⾼精度⽇期5.6.4以前不⽀持⼩数秒精度
5.6.4开始
TIME,DATETIME,TIMESTAMP
⽀持,最多可以6位⼩数秒,也
就是微秒级别
TIMESTAMP[0-9]
占⽤空间7-11个字节,当⼩数秒精度为
0时与DATE类型相同,⼩数秒最⾼精
度可达9位,也就是纳精度
年份YEAR,1字节存储,只存储年
份,⽀持范围是[1901]⾄[2155]
⽆对应类型,可以⽤NUMBER(3,0)代
替
CHAR[0-255],定义长度默认
按字符长度计算,最⼤保存255
字符
CHAR[1-2000]
定义默认按字节长度计算
⽀持,⽤于数值类型不⽀持
TINYTEXT 最⼤⽀持255个字节
TEXT最⼤⽀持65535个字节
MEDIUMTEXT最⼤⽀持16MB
个字节
LONGTEXT最⼤⽀持4GB字节
字段不⽀持默认值
⽀持(CLOB)
oracle10g以前最⼤⽀持4GB个字节
oracle10g开始最⼤⽀持4GB个数据
块,数据块⼤⼩为2KB-32KB
oracle还有⼀个LONG类型,是早期的
存储⼤字符串类型,最⼤⽀持2GB字
节,现已不推荐使⽤
TINYBLOB 最⼤⽀持255个字节
BLOB最⼤⽀持65535个字节
MEDIUMBLOB最⼤⽀持16MB
个字节
LONGBLOB最⼤⽀持4GB字节
字段不⽀持默认值
⽀持(BLOB)
oracle10g以前最⼤⽀持4GB个字节
oracle10g开始最⼤⽀持4G个数据块,
数据块⼤⼩为2KB-32KB
oracle还有⼀个LONG RAW类型,是
早期的存储⼆进制类型,最⼤⽀持2GB
字节,现已不推荐使⽤
BINARY(0-255),定长
VARBINARY(0-65535),变长
RAW(1-2000)
ENUM(v1,v2,v3,...),最多65535
个元素
不⽀持
SET(v1,v2,v3,...),最多64个元
素
不⽀持
⽆,MYSQL可以对每个字段指
定字符编码
⽀持
NCHAR(1-2000)
NVARCHAR(1-4000)
NCLOB
不⽀持
⽀持
⽂件⼤⼩最⼤4GB
⽂件名称最长255字符
不⽀持⽀持
不⽀持⽀持
⽀持
使⽤简单
不⽀持
⼀般使⽤SEQUENCE解决,⽤法与⾃
增类型差别较⼤,使⽤较复杂,但能实
现⾮常灵活的应⽤,包括字符⾃增主
键、全局主键等等
不⽀持函数和表达式
TEXT和BLOB字段类型不⽀持
默认值
⽀持函数和表达式
⽀持,例如,把emp表的id字段
顺序放在name字段后⾯:
alter table emp modify column
id varchar(20) after name;
不⽀持,只能重建表或字段
不⽀持
11g⽀持,例:
create table sales
(
id number,
quantity number,
=单价*数量不⽀持 quantity number,
price number,
amount GENERATED always as
(quantity*price) virtual
);
INNODB 最⼤1000个字段
所有字段总定义长度不能超过
65535字节
所有固定长度字段的总长度不
超过半个数据块⼤⼩(数据块⼤
⼩⼀般为16K)
最⼤1000个字段
⼆、MySQL与Oracle数据库常见数据类型对应关系
编
号
ORACLE MYSQL注释
1NUMBER int / DECIMAL DECIMAL就是NUMBER(10,2)这样的结构INT就是是NUMBER(10),表⽰整型;MYSQL有很多类int型,tinyint mediumint bigint等,不同的int宽度不⼀样
2Varchar2(n)varchar(n)
3Date DATATIME ⽇期字段的处理
MYSQL⽇期字段分DATE和TIME两种,ORACLE⽇期字段只有DATE,包含年⽉⽇时分秒信息,⽤当前数据库的系统时间为 SYSDATE, 精确到秒,或者⽤字符串转换成⽇期型函数
TO_DATE(‘2001-08-01','YYYY-MM-DD')年-⽉-⽇ 24⼩时:分钟:秒的格式YYYY-MM-DD
HH24:MI:SS TO_DATE()还有很多种⽇期格式, 可以参看ORACLE DOC.⽇期型字段转换成字符串函数TO_CHAR(‘2001-08-01','YYYY-MM-DD HH24:MI:SS')
⽇期字段的数学运算公式有很⼤的不同。MYSQL到离当前时间7天
⽤ DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)ORACLE到离当前时间7天⽤ DATE_FIELD_NAME >SYSDATE - 7;
MYSQL中插⼊当前时间的⼏个函数是:NOW()函数以`'YYYY-MM-DD HH:MM:SS'返回当前的⽇期时间,可以直接存到DATETIME字段中。CURDATE()以'YYYY-MM-DD'的格式返回今天的⽇期,可以直接存到DATE字段中。CURTIME()以'HH:MM:SS'的格式返回当前的时间,可以直接存到TIME字段中。例:insert into tablename (fieldname) values (now())
⽽oracle中当前时间是sysdate
4INTEGER int / INTEGER Mysql中INTEGER等价于int
5EXCEPTION SQLEXCEPTION 详见<<2009001-eService-O2MG.doc>>中2.5 Mysql异常处理
6CONSTANT
VARCHAR2(1)
mysql中没有
CONSTANT关键
字
从ORACLE迁移到MYSQL,所有CONSTANT常量只能定义成变量
7TYPE g_grp_cur IS
REF CURSOR;
光标 : mysql中有
替代⽅案
详见<<2009001-eService-O2MG.doc>>中2.2 光标处理
8TYPE
unpacklist_type IS
mainactivity是什么TABLE OF
VARCHAR2(2000)
INDEX BY
BINARY_INTEGER;
数组: mysql中借助
临时表处理
或者直接写逻辑到
相应的代码中,
直接对集合中每个
值进⾏相应的处理
详见<<2009001-eService-O2MG.doc>>中2.4 数组处理
9⾃动增长的序列⾃动增长的数据类
型MYSQL有⾃动增长的数据类型,插⼊记录时不⽤操作此字段,会⾃动获得数据值。ORACLE 没有⾃动增长的数据类型,需要建⽴⼀个⾃动增长的序列号,插⼊记录时要把序列号的下⼀个值赋于此字段。
三三免费在线看电影10NULL NULL 空字符的处理
MYSQL的⾮空字段也有空的内容,ORACLE⾥定义了⾮空字段就不容许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构, 导数据的时候会产⽣错误。因此导数据时要对空字符进⾏判断,如果为NULL或空字符,需要把它改成⼀个空格的字符串。
MySQL与Oracle 差异⽐较之基本语法
编
号
类别ORACLE MYSQL注释
1变量的
声明⽅
式不同
li_index NUMBER := 0
DECLARE li_index
INTEGER DEFAULT 0
1. mysql 使⽤DECLARE定义局部变量.
定义变量语法为: DECLARE var_name[,...] type [DEFAULT value]
要给变量提供⼀个默认值,需要包含⼀个DEFAULT⼦句。值可以被
指定为⼀个表达式,不需要为⼀个常数。如果没有DEFAULT⼦句,
式不同INTEGER DEFAULT 0
指定为⼀个表达式,不需要为⼀个常数。如果没有DEFAULT⼦句,
初始值为NULL。
mysql语句转oracle2变量的
赋值⽅
式不同
lv_inputstr := iv_inputstr SET lv_inputstr = iv_inputstr
1. oracle变量赋值使⽤:=
mysql 使⽤赋值使⽤set关键字. 将⼀个值赋给⼀个变量时使⽤"=".
3跳出
linux基础命令解析(退
出)语
句不同
EXIT;LEAVE procedure name; 1. oracle: 如果exit语句在循环中就退出当前循环.如果exit语句不再循
环中,就退出当前过程或⽅法.
Mysql: 如果leave语句后⾯跟的是存储过程名,则退出当前存储过程.
如果leave语句后⾯跟的是lable名. 则退出当前lable.
while 条件 loop
exit;
end loop;
label_name:while 条件 do
leave label_name;
end while label_name;
4定义游
标TYPE g_grp_cur IS REF
CURSOR;
DECLARE cursor_name
CURSOR
FOR SELECT_statement;
oracle可以先定义游标,然后给游标赋值.
mysql定义游标时就需要给游标赋值. Mysql定义游标出⾃ Mysql 5.1
参考⼿册20.2.11.1.声明光标.
5定义数
组TYPE unpacklist_type IS
TABLE OF
VARCHAR2(2000) INDEX
BY BINARY_INTEGER;
可以使⽤临时表代替oracle
数组, 也可以循环拆分字符
来替代oracle数组.
⽬前可以使⽤临时表来代替oracle数组.
详见<<2009002-OTMPPS-Difficult Questions-0001.doc>>中2.4
Mysql数组处理部分
6注释⽅
式不同 "-- message" 或 "/** ….
*/" 或"/* …. */"
"-- message" 或 "/* ….
*/" 或 "#"
mysql注释来⾃ MySQL 5.1参考⼿册 9.5. 注释语法, 建议同oracle⼀
样, 单⾏⽤--, 多⾏/* */
7⾃带⽇
期时间
函数格
式不同
Oracle时间格式:yyyy-MM-
dd hh:mi:ss
Mysql时间格式:%Y-%m-
%d %H:%i:%s
1. MYSQL⽇期字段分DATE和TIME两种.
ORACLE⽇期字段只有DATE,包含年⽉⽇时分秒信息.
2. mysql中取当前系统时间为now()函数,精确到秒.
oracle中取当前数据库的系统时间为SYSDATE, 精确到秒.
8⽇期加
减当前时间加N天: sysdate+N
当前时间减N天: sysdate-N
⽇期相加: date_add(now(),
INTERVAL 180 DAY)
⽇期相减: date_sub('1998-
01-01 00:00:00', interval '1
1:1:1' day_second)
9字符串
连接符
不同
result := v_int1||v_int2;
set result
=concat(v_int1,v_int2);
1. oracle使⽤||连接字符串,也可以使⽤concat函数. 但Oracle的
concat函数只能连接两个字符串.
Mysql使⽤concat⽅法连接字符串. MySQL的concat函数可以连接⼀
个或者多个字符串,如
mysql> select concat('10'); 结果为: 10.
mysql> select concat('11','22','33','aa'); 结果为: 112233aa
2. "||"在Mysql是与运算日本java和中国java在线
10定义游
标不同CURSOR l_bk_cur IS
SELECT
B.BK_HDR_INT_KEY,
B.BK_NUM
FROM ES_SR_DTL_VRB
error和exception有啥区别A, ES_BK_HDR B
WHERE
A.BK_HDR_INT_KEY =
B.BK_HDR_INT_KEY
AND b.BK_STATUS !=
ES_BK_PKG.g_status_can
AND
A.SR_HDR_INT_KEY =
ii_sr_hdr_int_key;
DECLARE l_bk_cur
CURSOR
FOR SELECT
B.BK_HDR_INT_KEY,
B.BK_NUM
FROM
ES_SR_DTL_VRB A,
ES_BK_HDR B
WHERE
A.BK_HDR_INT_KEY =
B.BK_HDR_INT_KEY
AND b.BK_STATUS
!=
ES_BK_PKG.g_status_can
AND
A.SR_HDR_INT_KEY =
ii_sr_hdr_int_key;
详见<<2009002-OTMPPS-Difficult Questions-0001.doc>>中2.2
Mysql游标处理部分
11事务回
滚
ROLLBACK;ROLLBACK;oracle和mysql中使⽤⽅法相同
12GOTO
语句
GOTO check_date;GOTO check_date;oracle和mysql中使⽤⽅法相同
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论