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)⽆
DATE,3字节存储,只存储⽇
期,没有时间,⽀持范围是
[1000-01-01]⾄[9999-12-31]
TIME,3字节存储,只存储时
⽇期类型TIME,3字节存储,只存储时
间,没有⽇期,⽀持范围是[-
838:59:59]⾄[838:59:59]
DATETIME,占8字节存储,可
表⽰⽇期和时间,⽀持范围是
[1000-01-01 00:00:00]⾄[9999-
12-31 23:59:59]
jsp技术的参考文献近几年TIMESTAMP,占4字节存储,
可表⽰⽇期和时间,范围是
[1970-01-01 00:00:00]⾄[2038-
01-19 03:14:07]
DATE类型
7字节存储,可表⽰⽇期和
maya建模素材免费网站时间,⽀持范围是[-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位,也就是纳精度
年份
份,⽀持范围是[1901]⾄[2155]⽆对应类型,可以⽤NUMBER(3,0)代替
定长字符串CHAR[0-255],定义长度默认
按字符长度计算,最⼤保存255
字符
CHAR[1-2000]
定义默认按字节长度计算
⽆符号说明⽀持,⽤于数值类型不⽀持
⼤字符串,⼀般⽤于存储⽂本⽂件或超⼤描述及备注类信息TINYTEXT 最⼤⽀持255个字节
TEXT最⼤⽀持65535个字节
MEDIUMTEXT最⼤⽀持16MB
个字节
LONGTEXT最⼤⽀持4GB字节
字段不⽀持默认值
⽀持(CLOB)
oracle10g以前最⼤⽀持
4GB个字节
oracle10g开始最⼤⽀持
mysql语句转oracle4GB个数据块,数据块⼤
⼩为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)
外部⽂件指针类型不⽀持⽀持
⽂件⼤⼩最⼤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字节
所有固定长度字段的总长度不
超过半个数据块⼤⼩(数据块⼤
⼩⼀般为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 := 0DECLARE li_index
INTEGER DEFAULT 0
1. mysql 使⽤DECLARE 定义局部变量.
定义变量语法为: DECLARE var_name[,...] type [DEFAULT value] 要给变量提供⼀个默认值,需要包含⼀个DEFAULT ⼦句。值可以被指定为⼀个表达式,不需要为⼀个常数。如果没有DEFAULT ⼦句,初始值为NULL 。
2变量的赋
值⽅式不同
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;
可以使⽤临时表代替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 '11: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_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;
DECLARE l_bk_cur CURSOR
FOR SELECT
B.BK_HDR_INT_KEY,
B.BK_NUM
FROM
ES_SR_DTL_VRB A,rehydration
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小时内删除。
发表评论