2020-11-02,MySQL與Oracle資料型別,用法對比大全
常見的資料型別再MySQL和Oracle裡的表現形式
說明 | mysql | oracle |
變長字串 | VARCHAR[0-65535] 定義長度預設按字元長度計算,如果是GBK編碼的漢字將佔用2個位元組 | VARCHAR2[1-4000] 定義預設按位元組長度計算 |
整數 | TINYINT(-128-127) SMALLINT(-32768-32767) MEDIUMINT(-8388608-8388607) INT(-2147483648-2147483647) | 無專用型別, 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]] | 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] | DATE型別 |
高精度日期 | 5.6.4以前不支援小數秒精度 | TIMESTAMP[0-9] |
年份 | YEAR,1位元組儲存,只儲存年份,支援範圍是[1901]至[2155] | 無對應型別,可以用NUMBER(3,0)代替 |
定長字串 | CHAR[0-255],定義長度預設按字元長度計算,最大儲存255字元 | CHAR[1-2000] 定義預設按位元組長度計算 |
無符號說明 | 支援,用於數值型別 | 不支援 |
大字串,一般用於儲存文字檔案或超大描述及備註類資訊 | TINYTEXT 最大支援255個位元組 | 支援(CLOB) oracle10g開始最大支援4GB個資料塊,資料塊大小為2KB-32KB oracle還有一個LONG型別,是早期的儲存大字串型別,最大支援2GB位元組,現已不推薦使用 |
二進位制物件,一般用於儲存檔案或圖片資料 | TINYBLOB 最大支援255個位元組 LONGBLOB最大支援4GB位元組
欄位不支援預設值 | 支援(BLOB) oracle10g以前最大支援4GB個位元組 oracle10g開始最大支援4G個資料塊,資料塊大小為2KB-32KB oracle還有一個LONG RAW型別,是早期的儲存二進位制型別,最大支援2GB位元組,現已不推薦使用 |
二進位制資訊 | BINARY(0-255),定長 | RAW(1-2000) |
列舉型別 | ENUM(v1,v2,v3,...),最多65535個元素 | 不支援 |
集合型別 | SET(v1,v2,v3,...),最多64個元素 | 不支援 |
國際化字符集型別,較少使用 | 無,MYSQL可以對每個欄位指定字元編碼 | 支援 |
外部檔案指標型別 | 不支援 | 支援 |
| 不支援 | 支援 |
| 不支援 | 支援 |
自動增長型別 | 支援 | 不支援 |
| 不支援函式和表示式 | 支援函式和表示式 |
| 支援,例如,把emp表的id欄位順序放在name欄位後面: | 不支援,只能重建表或欄位 |
虛擬欄位是一個邏輯欄位定義,其結果值通常是一個表示式,並在表中儲存物理值,不佔用空間,主要用於簡化查詢邏輯。比如有一個商品銷售表有單價和數量兩個欄位,那可以建一個虛擬欄位金額,其表示式=單價*數量 | 不支援 | 11g支援,例: |
| INNODB 最大1000個欄位 | 最大1000個欄位 |
MySQL資料型別與Oracle的對比
編號 | ORACLE | MYSQL | 註釋 |
1 | NUMBER | int / DECIMAL | DECIMAL就是NUMBER(10,2)這樣的結構INT就是是NUMBER(10),表示整型; MYSQL有很多類int型,tinyint mediumint bigint等,不同的int寬度不一樣 |
2 | Varchar2(n) | varchar(n) | |
3 | Date | 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 |
4 | INTEGER | int / INTEGER | Mysql中INTEGER等價於int |
5 | EXCEPTION | SQLEXCEPTION | 詳見<<2009001-eService-O2MG.doc>>中2.5 Mysql異常處理 |
6 | CONSTANT VARCHAR2(1) | mysql中沒有CONSTANT關鍵字 | 從ORACLE遷移到MYSQL,所有CONSTANT常量只能定義成變數 |
7 | TYPE g_grp_cur IS REF CURSOR; | 游標 : mysql中有替代方案 | 詳見<<2009001-eService-O2MG.doc>>中2.2 游標處理 |
8 | TYPE unpacklist_type IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER; | 陣列: mysql中藉助臨時表處理 或者直接寫邏輯到相應的程式碼中, 直接對集合中每個值進行相應的處理 | 詳見<<2009001-eService-O2MG.doc>>中2.4 陣列處理 |
9 | 自動增長的序列 | 自動增長的資料型別 | MYSQL有自動增長的資料型別,插入記錄時不用操作此欄位,會自動獲得資料值。ORACLE沒有自動增長的資料型別,需要建立一個自動增長的序列號,插入記錄時要把序列號的下一個值賦於此欄位。 |
10 | NULL | 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 | 變數的賦值方式不同 | 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 '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_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遊標處理部分 |
11 | 事務回滾 | ROLLBACK; | ROLLBACK; | oracle和mysql中使用方法相同 |
12 | GOTO語句 | GOTO check_date; | GOTO check_date; | oracle和mysql中使用方法相同 |
相關文章
- Java 支援的資料型別與 MySQL 支援的資料型別對比Java資料型別MySql
- MySql和SQL Server資料型別 對比MySqlServer資料型別
- MySQL資料型別DECIMAL用法MySql資料型別Decimal
- 【MySQL】資料型別的基本用法MySql資料型別
- MYSQL資料庫型別與JAVA型別對應關係MySql資料庫型別Java
- Oracle資料型別對應Java型別Oracle資料型別Java
- 《卸甲筆記》-PostgreSQL和Oracle的資料型別的對比系列四:大資料型別筆記SQLOracle資料型別大資料
- MySQL與oracle的資料型別轉換總結MySqlOracle資料型別
- 《卸甲筆記》-PostgreSQL和Oracle的資料型別的對比系列五:其它型別筆記SQLOracle資料型別
- Java 資料型別和 MySql 資料型別對應一覽表JavaMySQL 資料型別
- MySQL與Java常用資料型別的對應關係MySqlJava資料型別
- oracle Mysql PostgreSQL 資料庫的對比OracleMySql資料庫
- mysql資料庫中decimal資料型別比較大小MySql資料庫Decimal資料型別
- 資料庫選型比對 Oracle vs sqlserver資料庫OracleSQLServer
- Oracle和sqlserver資料型別對應OracleSQLServer資料型別
- MySQL 資料對比MySql
- HierarchyID 資料型別用法資料型別
- MySQL資料型別操作(char與varchar)MySql資料型別
- <轉>Oracle資料型別與.NET中的對應關係Oracle資料型別
- Java資料型別與資料庫欄位型別對應關係Java資料型別資料庫
- [轉]ABAP資料型別與Java資料型別的對應關係資料型別Java
- MYSQL 資料型別MySQL 資料型別
- [Mysql]資料型別MySql資料型別
- MySQL資料型別MySql資料型別
- Oracle三種集合資料型別的比較Oracle資料型別
- oracle中date資料型別與timestamp資料型別的轉換Oracle資料型別
- 資料庫事務與隔離級別示例(oracle與sql server對比)資料庫OracleSQLServer
- Oracle和MySQL資料庫CTAS等操作對比OracleMySql資料庫
- python 與 Mysql 資料型別轉換PythonMySQL 資料型別
- 資料型別與函式索引-MySQL篇資料型別函式索引MySql
- MySQL字元資料型別char與varchar的區別MySql字元資料型別
- oracle對BLOB型別資料的操作與效能問題(轉載)Oracle型別
- Oracle資料型別Oracle資料型別
- Oracle 資料型別Oracle資料型別
- Oracle的 資料型別比較及注意事項Oracle資料型別
- MySQL 的資料型別MySql資料型別
- 理解MySQL資料型別MySql資料型別
- MySQL的資料型別MySql資料型別