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