MySQL与Oracle数据类型对应关系(表格形式)MySQL与Oracle两种数据库在⼯作中,都是⽤的⽐较多的数据库,由于MySQL与Oracle在数据类型上有部分差异,在我们迁移数据库时,会遇上⼀定的⿇烦,下⾯介绍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)⽆
位类型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字节存储,
可表⽰⽇期和时间,范围是
[1970-01-01 00:00:00]⾄[2038-
01-19 03:14:07]
DATE类型
7字节存储,可表⽰⽇期和时
间,⽀持范围是[-4712-01-01
00:00:00]⾄[9999-12-31
23:59:59]
⾼精度⽇期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)
枚举类型
个元素
不⽀持
集合类型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,
price    number,
amount  GENERATED always
as (quantity*price) virtual
);
INNODB 最⼤1000个字段
所有字段总定义长度不能超过
65535字节
netstat plus下载所有固定长度字段的总长度不
超过半个数据块⼤⼩(数据块⼤
⼩⼀般为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
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⼦句,初始值为NULL。
2变量的
赋值⽅
told
式不同
lv_inputstr := iv_inputstr SET lv_inputstr = iv_inputstr
1. oracle变量赋值使⽤:=
mysql 使⽤赋值使⽤set关键字. 将⼀个值赋给⼀个变量时
使⽤"=".
3跳出
(退
出)语
句不同
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;
可以使⽤临时表代替oraclemysql语句转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是与运算
10定义游
标不同CURSOR l_bk_cur IS
SELECT
B.BK_HDR_INT_KEY,
B.BK_NUMheadache意思
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;
DECLARE l_bk_cur
CURSOR
redis客户端工具有哪些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中使⽤⽅法相同
以上就是MySQL与Oracle数据类型对应关系的全部内容了

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。