溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL與Oracle數(shù)據(jù)類型對(duì)應(yīng)關(guān)系的示例分析

發(fā)布時(shí)間:2021-07-28 11:41:11 來源:億速云 閱讀:1329 作者:小新 欄目:數(shù)據(jù)庫

這篇文章將為大家詳細(xì)講解有關(guān)MySQL與Oracle數(shù)據(jù)類型對(duì)應(yīng)關(guān)系的示例分析,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

MySQL與Oracle兩種數(shù)據(jù)庫在工作中,都是用的比較多的數(shù)據(jù)庫,由于MySQL與Oracle在數(shù)據(jù)類型上有部分差異,在我們遷移數(shù)據(jù)庫時(shí),會(huì)遇上一定的麻煩,下面介紹MySQL與Oracle數(shù)據(jù)庫數(shù)據(jù)類型的對(duì)應(yīng)關(guān)系。

一、常見數(shù)據(jù)類型在MySQL與Oracle數(shù)據(jù)庫中的表現(xiàn)形式

說明

mysql

oracle

變長(zhǎng)字符串

VARCHAR[0-65535]

定義長(zhǎng)度默認(rèn)按字符長(zhǎng)度計(jì)算,如果是GBK編碼的漢字將占用2個(gè)字節(jié)

VARCHAR2[1-4000]
 VARCHAR是VARCHAR2的同義詞

定義默認(rèn)按字節(jié)長(zhǎng)度計(jì)算

整數(shù)

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)的同義詞

數(shù)值類型

DECIMAL[1-65[,0-30]]
 NUMERIC是DECIMAL的同義詞

NUMBER 可表示數(shù)范圍: 1*10^-130至1*10^126

NUMBER([1-38][,-84-127])

 

DECIMAL、NUMERIC、DEC是NUMBER的同義詞

浮點(diǎn)型

FLOAT(D,M)

oracle10g開始增加BINARY_FLOAT類型

10g以前無專用類型,可以用NUMBER代替

ORACLE中有FLOAT和REAL類型,不過這是NUMBER的同義詞

雙精度浮點(diǎn)型

DOUBLE(D,M)

oracle10g開始增加BINARY_DOUBLE類型

10g以前無專用類型,可以用NUMBER代替

ORACLE中有DOUBLE PRECISION類型,不過這是NUMBER的同義詞

位類型

BIT(1-64)

日期類型

DATE,3字節(jié)存儲(chǔ),只存儲(chǔ)日期,沒有時(shí)間,支持范圍是[1000-01-01]至[9999-12-31]
 TIME,3字節(jié)存儲(chǔ),只存儲(chǔ)時(shí)間,沒有日期,支持范圍是[-838:59:59]至[838:59:59]
 DATETIME,占8字節(jié)存儲(chǔ),可表示日期和時(shí)間,支持范圍是[1000-01-01 00:00:00]至[9999-12-31 23:59:59]
 TIMESTAMP,占4字節(jié)存儲(chǔ),可表示日期和時(shí)間,范圍是[1970-01-01 00:00:00]至[2038-01-19 03:14:07]

DATE類型
 7字節(jié)存儲(chǔ),可表示日期和時(shí)間,支持范圍是[-4712-01-01 00:00:00]至[9999-12-31 23:59:59]

高精度日期

5.6.4以前不支持小數(shù)秒精度
 5.6.4開始TIME,DATETIME,TIMESTAMP支持,最多可以6位小數(shù)秒,也就是微秒級(jí)別

TIMESTAMP[0-9]
 占用空間7-11個(gè)字節(jié),當(dāng)小數(shù)秒精度為0時(shí)與DATE類型相同,小數(shù)秒最高精度可達(dá)9位,也就是納精度

年份

YEAR,1字節(jié)存儲(chǔ),只存儲(chǔ)年份,支持范圍是[1901]至[2155]

無對(duì)應(yīng)類型,可以用NUMBER(3,0)代替

定長(zhǎng)字符串

CHAR[0-255],定義長(zhǎng)度默認(rèn)按字符長(zhǎng)度計(jì)算,最大保存255字符

CHAR[1-2000]

定義默認(rèn)按字節(jié)長(zhǎng)度計(jì)算

無符號(hào)說明

支持,用于數(shù)值類型

不支持

大字符串,一般用于存儲(chǔ)文本文件或超大描述及備注類信息

TINYTEXT 最大支持255個(gè)字節(jié)
 TEXT最大支持65535個(gè)字節(jié)
 MEDIUMTEXT最大支持16MB個(gè)字節(jié)
 LONGTEXT最大支持4GB字節(jié)
 
 字段不支持默認(rèn)值

支持(CLOB)
 oracle10g以前最大支持4GB個(gè)字節(jié)

oracle10g開始最大支持4GB個(gè)數(shù)據(jù)塊,數(shù)據(jù)塊大小為2KB-32KB

oracle還有一個(gè)LONG類型,是早期的存儲(chǔ)大字符串類型,最大支持2GB字節(jié),現(xiàn)已不推薦使用

二進(jìn)制對(duì)象,一般用于存儲(chǔ)文件或圖片數(shù)據(jù)

TINYBLOB 最大支持255個(gè)字節(jié)
 BLOB最大支持65535個(gè)字節(jié)
 MEDIUMBLOB最大支持16MB個(gè)字節(jié)

LONGBLOB最大支持4GB字節(jié)

 

字段不支持默認(rèn)值

支持(BLOB)

oracle10g以前最大支持4GB個(gè)字節(jié)
  

oracle10g開始最大支持4G個(gè)數(shù)據(jù)塊,數(shù)據(jù)塊大小為2KB-32KB

oracle還有一個(gè)LONG RAW類型,是早期的存儲(chǔ)二進(jìn)制類型,最大支持2GB字節(jié),現(xiàn)已不推薦使用

二進(jìn)制信息

BINARY(0-255),定長(zhǎng)
 VARBINARY(0-65535),變長(zhǎng)

RAW(1-2000)

枚舉類型

ENUM(v1,v2,v3,...),最多65535個(gè)元素

不支持

集合類型

SET(v1,v2,v3,...),最多64個(gè)元素

不支持

國際化字符集類型,較少使用

無,MYSQL可以對(duì)每個(gè)字段指定字符編碼

支持
 NCHAR(1-2000)
 NVARCHAR(1-4000)
 NCLOB

外部文件指針類型

不支持

支持
 文件大小最大4GB
 文件名稱最長(zhǎng)255字符

 

不支持

支持

 

不支持

支持

自動(dòng)增長(zhǎng)類型

支持
 使用簡(jiǎn)單

不支持
 一般使用SEQUENCE解決,用法與自增類型差別較大,使用較復(fù)雜,但能實(shí)現(xiàn)非常靈活的應(yīng)用,包括字符自增主鍵、全局主鍵等等

 

不支持函數(shù)和表達(dá)式
 TEXT和BLOB字段類型不支持默認(rèn)值

支持函數(shù)和表達(dá)式

 

支持,例如,把emp表的id字段順序放在name字段后面:
 alter table emp modify column id varchar(20) after name;

不支持,只能重建表或字段

虛擬字段是一個(gè)邏輯字段定義,其結(jié)果值通常是一個(gè)表達(dá)式,并在表中存儲(chǔ)物理值,不占用空間,主要用于簡(jiǎn)化查詢邏輯。比如有一個(gè)商品銷售表有單價(jià)和數(shù)量?jī)蓚€(gè)字段,那可以建一個(gè)虛擬字段金額,其表達(dá)式=單價(jià)*數(shù)量

不支持

11g支持,例:
 create table sales
 (
   id       number,
   quantity number,
   price    number,
   amount   GENERATED always as (quantity*price) virtual
 );

 

INNODB 最大1000個(gè)字段
 所有字段總定義長(zhǎng)度不能超過65535字節(jié)
 所有固定長(zhǎng)度字段的總長(zhǎng)度不超過半個(gè)數(shù)據(jù)塊大小(數(shù)據(jù)塊大小一般為16K)

最大1000個(gè)字段

二、MySQL與Oracle數(shù)據(jù)庫常見數(shù)據(jù)類型對(duì)應(yīng)關(guān)系

編號(hào)ORACLEMYSQL注釋
1NUMBERint / DECIMALDECIMAL就是NUMBER(10,2)這樣的結(jié)構(gòu)INT就是是NUMBER(10),表示整型;
 MYSQL有很多類int型,tinyint mediumint bigint等,不同的int寬度不一樣
2Varchar2(n)varchar(n) 
3DateDATATIME日期字段的處理
 MYSQL日期字段分DATE和TIME兩種,ORACLE日期字段只有DATE,包含年月日時(shí)分秒信息,用當(dāng)前數(shù)據(jù)庫的系統(tǒng)時(shí)間為 SYSDATE, 精確到秒,或者用字符串轉(zhuǎn)換成日期型函數(shù)TO_DATE(‘2001-08-01','YYYY-MM-DD')年-月-日 24小時(shí):分鐘:秒的格式Y(jié)YYY-MM-DD HH24:MI:SS TO_DATE()還有很多種日期格式, 可以參看ORACLE DOC.日期型字段轉(zhuǎn)換成字符串函數(shù)TO_CHAR(‘2001-08-01','YYYY-MM-DD HH24:MI:SS')
 
 日期字段的數(shù)學(xué)運(yùn)算公式有很大的不同。MYSQL找到離當(dāng)前時(shí)間7天用 DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)ORACLE找到離當(dāng)前時(shí)間7天用 DATE_FIELD_NAME >SYSDATE - 7;
 
 MYSQL中插入當(dāng)前時(shí)間的幾個(gè)函數(shù)是:NOW()函數(shù)以`'YYYY-MM-DD HH:MM:SS'返回當(dāng)前的日期時(shí)間,可以直接存到DATETIME字段中。CURDATE()以'YYYY-MM-DD'的格式返回今天的日期,可以直接存到DATE字段中。CURTIME()以'HH:MM:SS'的格式返回當(dāng)前的時(shí)間,可以直接存到TIME字段中。例:insert into tablename (fieldname) values (now())
 
 而oracle中當(dāng)前時(shí)間是sysdate
4INTEGERint / INTEGERMysql中INTEGER等價(jià)于int
5EXCEPTIONSQLEXCEPTION 詳見<<2009001-eService-O2MG.doc>>中2.5 Mysql異常處理
6CONSTANT VARCHAR2(1)mysql中沒有CONSTANT關(guān)鍵字從ORACLE遷移到MYSQL,所有CONSTANT常量只能定義成變量
7TYPE g_grp_cur IS REF CURSOR;光標(biāo) : mysql中有替代方案詳見<<2009001-eService-O2MG.doc>>中2.2 光標(biāo)處理
8TYPE unpacklist_type IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;數(shù)組: mysql中借助臨時(shí)表處理
 或者直接寫邏輯到相應(yīng)的代碼中,
 直接對(duì)集合中每個(gè)值進(jìn)行相應(yīng)的處理
詳見<<2009001-eService-O2MG.doc>>中2.4 數(shù)組處理
9自動(dòng)增長(zhǎng)的序列自動(dòng)增長(zhǎng)的數(shù)據(jù)類型MYSQL有自動(dòng)增長(zhǎng)的數(shù)據(jù)類型,插入記錄時(shí)不用操作此字段,會(huì)自動(dòng)獲得數(shù)據(jù)值。ORACLE沒有自動(dòng)增長(zhǎng)的數(shù)據(jù)類型,需要建立一個(gè)自動(dòng)增長(zhǎng)的序列號(hào),插入記錄時(shí)要把序列號(hào)的下一個(gè)值賦于此字段。
10NULLNULL空字符的處理
 MYSQL的非空字段也有空的內(nèi)容,ORACLE里定義了非空字段就不容許有空的內(nèi)容。按MYSQL的NOT NULL來定義ORACLE表結(jié)構(gòu), 導(dǎo)數(shù)據(jù)的時(shí)候會(huì)產(chǎn)生錯(cuò)誤。因此導(dǎo)數(shù)據(jù)時(shí)要對(duì)空字符進(jìn)行判斷,如果為NULL或空字符,需要把它改成一個(gè)空格的字符串。

MySQL與Oracle 差異比較之基本語法

編號(hào)類別ORACLEMYSQL注釋
1變量的聲明方式不同li_index NUMBER := 0DECLARE li_index INTEGER DEFAULT 01. mysql 使用DECLARE定義局部變量. 
    定義變量語法為:  DECLARE var_name[,...] type [DEFAULT value] 要給變量提供一個(gè)默認(rèn)值,需要包含一個(gè)DEFAULT子句。值可以被指定為一個(gè)表達(dá)式,不需要為一個(gè)常數(shù)。如果沒有DEFAULT子句,初始值為NULL。   
2變量的賦值方式不同lv_inputstr := iv_inputstrSET lv_inputstr = iv_inputstr1. oracle變量賦值使用:=  
    mysql 使用賦值使用set關(guān)鍵字. 將一個(gè)值賦給一個(gè)變量時(shí)使用"=". 
3跳出(退出)語句不同EXIT;LEAVE procedure name;1. oracle: 如果exit語句在循環(huán)中就退出當(dāng)前循環(huán).如果exit語句不再循環(huán)中,就退出當(dāng)前過程或方法. 
    Mysql: 如果leave語句后面跟的是存儲(chǔ)過程名,則退出當(dāng)前存儲(chǔ)過程. 如果leave語句后面跟的是lable名. 則退出當(dāng)前l(fā)able. 
    
while 條件 loop
 exit;
 end loop;
label_name:while 條件 do
     leave label_name;
 end while label_name;
4定義游標(biāo)TYPE g_grp_cur IS REF CURSOR;
      
DECLARE cursor_name CURSOR FOR SELECT_statement;oracle可以先定義游標(biāo),然后給游標(biāo)賦值. 
 mysql定義游標(biāo)時(shí)就需要給游標(biāo)賦值. Mysql定義游標(biāo)出自 Mysql 5.1 參考手冊(cè)20.2.11.1.聲明光標(biāo).
5定義數(shù)組TYPE unpacklist_type IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;可以使用臨時(shí)表代替oracle數(shù)組, 也可以循環(huán)拆分字符來替代oracle數(shù)組.目前可以使用臨時(shí)表來代替oracle數(shù)組. 
 詳見<<2009002-OTMPPS-Difficult Questions-0001.doc>>中2.4 Mysql數(shù)組處理部分
6注釋方式不同 "-- message"  或 "/** ….  */" 或"/* ….  */""-- message"  或 "/* ….  */" 或 "#"mysql注釋來自  MySQL 5.1參考手冊(cè) 9.5. 注釋語法, 建議同oracle一樣, 單行用--, 多行/* */
7自帶日期時(shí)間函數(shù)格式不同Oracle時(shí)間格式:yyyy-MM-dd hh:mi:ssMysql時(shí)間格式:%Y-%m-%d %H:%i:%s1. MYSQL日期字段分DATE和TIME兩種. 
    ORACLE日期字段只有DATE,包含年月日時(shí)分秒信息. 
 2. mysql中取當(dāng)前系統(tǒng)時(shí)間為now()函數(shù),精確到秒. 
    oracle中取當(dāng)前數(shù)據(jù)庫的系統(tǒng)時(shí)間為SYSDATE, 精確到秒.
8日期加減當(dāng)前時(shí)間加N天: sysdate+N
 當(dāng)前時(shí)間減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函數(shù). 但Oracle的concat函數(shù)只能連接兩個(gè)字符串.
  Mysql使用concat方法連接字符串. MySQL的concat函數(shù)可以連接一個(gè)或者多個(gè)字符串,如
        mysql> select concat('10');   結(jié)果為: 10.
        mysql> select concat('11','22','33','aa'); 結(jié)果為: 112233aa
 2. "||"在Mysql是與運(yùn)算
10定義游標(biāo)不同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, 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游標(biāo)處理部分
11事務(wù)回滾ROLLBACK;ROLLBACK;oracle和mysql中使用方法相同
12GOTO語句GOTO check_date;GOTO check_date;oracle和mysql中使用方法相同

關(guān)于“MySQL與Oracle數(shù)據(jù)類型對(duì)應(yīng)關(guān)系的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI