一、表空間
mysql的表空間有共享表空間和獨占表空間,獨占表空間,其實就是一張表一個表空間,其實也就是一張表一個數據文件,共享表空間似乎有點類似oracle的表空間,不同的表可以保存在同一個數據文件里,一般mysql沒有單獨創建表空間的步驟而oracle要先創建好表空間,然后指定某張表放到某個表空間。
二、數據類型
1、oracle表結構移植到mysql中需要的類型轉換
MYSQL ORACLE BLOB(220) RAW(220) BLOB (20) RAW(20) BLOG(1024) RAW(1024) VARCHAR(n) VARCHAR2(n) CHAR CHAR FLOAT(22,6) NUMBER(22,6) DOUBLE(44,12) NUMBER(44,12) TINYINT (3) NUMBER(3) SMALLINT(5) NUMBER(5) MEDIUMINT(8) NUMBER(8) INT(10) NUMBER(10) BIGINT(20) NUMBER(20) DATATIME DATA
2、mysql和oracle數據類型對應關系參照表
MySQL Data Type |
Oracle Data Type |
BIGINT |
NUMBER(19, 0) |
BIT |
RAW |
BLOB |
BLOB, RAW |
CHAR |
CHAR |
DATE |
DATE |
DATETIME |
DATE |
DECIMAL |
FLOAT (24) |
DOUBLE |
FLOAT (24) |
DOUBLE PRECISION |
FLOAT (24) |
ENUM |
VARCHAR2 |
FLOAT |
FLOAT |
INT |
NUMBER(10, 0) |
INTEGER |
NUMBER(10, 0) |
LONGBLOB |
BLOB, RAW |
LONGTEXT |
CLOB, RAW |
MEDIUMBLOB |
BLOB, RAW |
MEDIUMINT |
NUMBER(7, 0) |
MEDIUMTEXT |
CLOB, RAW |
NUMERIC |
NUMBER |
REAL |
FLOAT (24) |
SET |
VARCHAR2 |
SMALLINT |
NUMBER(5, 0) |
TEXT |
VARCHAR2, CLOB |
TIME |
DATE |
TIMESTAMP |
DATE |
TINYBLOB |
RAW |
TINYINT |
NUMBER(3, 0) |
TINYTEXT |
VARCHAR2 |
VARCHAR |
VARCHAR2, CLOB |
YEAR |
NUMBER |
三、常用函數比較
1、返回當前時間的時間戳。
Oracle :( (in_DATETIME -TO_DATETIME('19700101','yyyymmdd'))*86400 - TO_INT(SUBSTR(TZ_OFFSET(sessiontimezone),1,3))*3600) mysql :( timestampdiff(second,'19700101',in_DATETIME) - timestampdiff(second,utc_time(),now()))
2、日期前一天
Oracle : sysdate - 1; mysql : date_sub(curdate(),interval 1 day);
3、trim函數
trim(' xxxx ')、ltrim(' xxxx ')、rtrim(' xxxx ') #Oracle與mysql用法一致都是去除兩邊、左邊、右邊的空格。
Oracle
trim('1112222667671122','12') 、ltrim('1112222667671122','12')、rtrim('1112222667671122','12') #oracle用法是去除兩邊開始、左邊開始、右邊開始起的所有包含第二個字符串中的字符,所以結果為66767、667671122、111222266767。
mysql要想實現這個方法也可以,但是mysql只提供了trim一個方法,至於其他的就要自己寫函數了。
TRIM('12' FROM '11122342341122') #2234234
其他函數一覽表:
編號 | 類別 | ORACLE | MYSQL | 注釋 |
1 | 數字函數 | round(1.23456,4) | round(1.23456,4) | 一樣: ORACLE:select round(1.23456,4) value from dual MYSQL:select round(1.23456,4) value |
2 | abs(-1) | abs(-1) | 功能: 將當前數據取絕對值 用法: oracle和mysql用法一樣 mysql: select abs(-1) value oracle: select abs(-1) value from dual |
|
3 | ceil(-1.001)) | ceiling(-1.001) | 功能: 返回不小於 X 的最小整數 用法: mysqls: select ceiling(-1.001) value oracle: select ceil(-1.001) value from dual |
|
4 | floor(-1.001) | floor(-1.001) | 功能: 返回不大於 X 的最大整數值 用法: mysql: select floor(-1.001) value oracle: select floor(-1.001) value from dual |
|
5 | Max(expr)/Min(expr) | Max(expr)/Min(expr) | 功能:返回 expr 的最小或最大值。MIN() 和 MAX() 可以接受一個字符串參數;在這 種情況下,它們將返回最小或最大的字符串傳下。 用法: ROACLE: select max(user_int_key) from sd_usr; MYSQL: select max(user_int_key) from sd_usr; |
|
6 | 字符串函數 | ascii(str) | ascii(str) | 功能:返回字符串 str 最左邊的那個字符的 ASCII 碼值。如果 str 是一個空字符串, 那么返回值為 0。如果 str 是一個 NULL,返回值也是 NULL. 用法: mysql:select ascii('a') value oracle:select ascii('a') value from dual |
7 | CHAR(N,...) | CHAR(N,...) | 功能:CHAR() 以整數類型解釋參數,返回這個整數所代表的 ASCII 碼值給出的字符 組成的字符串。NULL 值將被忽略. 用法: mysql:select char(97) value oracle:select chr(97) value from dual |
|
8 | REPLACE(str,from_str,to_str) | REPLACE(str,from_str,to_str) | 功能: 在字符串 str 中所有出現的字符串 from_str 均被 to_str 替換,然后返回這個字符串. 用法: mysql: SELECT REPLACE('abcdef', 'bcd', 'ijklmn') value oracle: SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual |
|
9 | INSTR('sdsq','s',2) | INSTR('sdsq','s') | 參數個數不同 ORACLE: select INSTR('sdsq','s',2) value from dual(要求從位置2開始) MYSQL: select INSTR('sdsq','s') value(從默認的位置1開始) |
|
10 | SUBSTR('abcd',2,2) | substring('abcd',2,2) | 函數名稱不同: ORACLE: select substr('abcd',2,2) value from dual MYSQL: select substring('abcd',2,2) value |
|
11 | instr(‘abcdefg’,’ab’) | locate(‘ab’,’abcdefg’) | 函數名稱不同: instr -> locate(注意:locate的子串和總串的位置要互換) ORACLE: SELECT instr('abcdefg', 'ab') VALUE FROM DUAL MYSQL: SELECT locate('ab', 'abcdefg') VALUE |
|
12 | length(str) | char_length() | 函數名稱不同: ORACEL: SELECT length('AAAASDF') VALUE FROM DUAL MYSQL: SELECT char_length('AAAASDF') VALUE |
|
13 | REPLACE('abcdef', 'bcd', 'ijklmn') | REPLACE('abcdef', 'bcd', 'ijklmn') | 一樣: ORACLE: SELECT REPLACE('abcdef', 'bcd', 'ijklmn') value from dual MYSQL: SELECT REPLACE('abcdef', 'bcd', 'ijklmn') value |
|
14 | LPAD('abcd',14, '0') | LPAD('abcd',14, '0') | 一樣: ORACLE: select LPAD('abcd',14, '0') value from dual MYSQL: select LPAD('abcd',14, '0') value from dual |
|
15 | UPPER(iv_user_id) | UPPER(iv_user_id) | 一樣: ORACLE: select UPPER(user_id) from sd_usr; MYSQL: select UPPER(user_id) from sd_usr; |
|
16 | LOWER(iv_user_id) | LOWER(iv_user_id) | 一樣: ORACLE: select LOWER(user_id) from sd_usr; MYSQL: select LOWER(user_id) from sd_usr; |
|
17 | 控制流函數 | nvl(u.email_address, 10) | IFNULL(u.email_address, 10) 或 ISNULL(u.email_address) |
函數名稱不同(根據不同的作用進行選擇): ORACLE: select u.email_address, nvl(u.email_address, 10) value from sd_usr u (如果u.email_address=NULl,就在DB中用10替換其值) MYSQL: select u.email_address, IFNULL(u.email_address, 10) value from sd_usr u(如果u.email_address=NULl,顯示結果中是10,而不是在DB中用10替換其值) select u.email_address, ISNULL(u.email_address) value from sd_usr u(如果u.email_address是NULL, 就顯示1<true>,否則就顯示0<false>) |
18 | DECODE(iv_sr_status,g_sr_status_com, ld_sys_date, NULL) | 無,請用IF或CASE語句代替. IF語句格式:(expr1,expr2,expr3) |
說明: 1. decode(條件,值1,翻譯值1,值2,翻譯值2,...值n,翻譯值n,缺省值) 該函數的含義如下: IF 條件=值1 THEN RETURN(翻譯值1) ELSIF 條件=值2 THEN RETURN(翻譯值2) ...... ELSIF 條件=值n THEN RETURN(翻譯值n) ELSE RETURN(缺省值) END IF 2. mysql If語法說明 功能: 如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),則IF()的返回值為expr2; 否則返回值則為 expr3。IF() 的返回值為數字值或字符串值,具體情況視其所在 語境而定。 用法: mysql: SELECT IF(1>2,2,3); |
|
19 | 類型轉換函數 | TO_CHAR(SQLCODE) | date_format/ time_format | 函數名稱不同 SQL> select to_char(sysdate,'yyyy-mm-dd') from dual; SQL> select to_char(sysdate,'hh24-mi-ss') from dual; mysql> select date_format(now(),'%Y-%m-%d'); mysql> select time_format(now(),'%H-%i-%S'); |
20 | to_date(str,format) | STR_TO_DATE(str,format) | 函數名稱不同: ORACLE:SELECT to_date('2009-3-6','yyyy-mm-dd') VAULE FROM DUAL MYSQL: SELECT STR_TO_DATE('2004-03-01', '%Y-%m-%d') VAULE |
|
21 | trunc(-1.002) | cast(-1.002 as SIGNED) | 函數名稱不同: TRUNC函數為指定元素而截去的日期值。 ORACLE: select trunc(-1.002) value from dual MYSQL:select cast(-1.002 as SIGNED) value MYSQL: 字符集轉換 : CONVERT(xxx USING gb2312) 類型轉換和SQL Server一樣,就是類型參數有點點不同 : CAST(xxx AS 類型) , CONVERT(xxx,類型),類型必須用下列的類型: 可用的類型 二進制,同帶binary前綴的效果 : BINARY 字符型,可帶參數 : CHAR() 日期 : DATE 時間: TIME 日期時間型 : DATETIME 浮點數 : DECIMAL 整數 : SIGNED 無符號整數 : UNSIGNED |
|
22 | TO_NUMBER(str) | CAST("123" AS SIGNED INTEGER) | 函數名稱不同 ORACLE:SELECT TO_NUMBER('123') AS VALUE FROM DUAL; MYSQL: SELECT CAST("123" AS SIGNED INTEGER) as value; SIGNED INTEGER:帶符號的整形 |
|
23 | 日期函數 | SYSDATE | now() / SYSDATE() | 寫法不同: ORACLE:select SYSDATE value from dual MYSQL:select now() value select sysdate() value |
24 | Next_day(sysdate,7) | 自定義一個函數:F_COMMON_NEXT_DAY(date,int) | 函數名稱不同: ORACLE: SELECT Next_day(sysdate,7) value FROM DUAL MYSQL: SELECT F_COMMON_NEXT_DAY(SYSDATE(), 3) value from DUAL; (3:指星期的索引值)返回的指定的緊接着下一個星期的日期 |
|
25 | ADD_MONTHS(sysdate, 2) | DATE_ADD(sysdate(), interval 2 month) | 函數名稱不同: ORACLE: SELECT ADD_MONTHS(sysdate, 2) as value from DUAL; MYSQL: SELECT DATE_ADD(sysdate(), interval 2 month) as value from DUAL; |
|
26 | 2個日期相減(D1-D2) | DATEDIFF(date1,date2) | 功能: 返回兩個日期之間的天數。 用法: mysql: SELECT DATEDIFF('2008-12-30','2008-12-29') AS DiffDate oracle: 直接用兩個日期相減(比如d1-d2=12.3) |
|
27 | SQL函數 | SQLCODE | MYSQL中沒有對應的函數,但JAVA中SQLException。getErrorCode()函數可以獲取錯誤號 | Oracle內置函數SQLCODE和SQLERRM是特別用在OTHERS處理器中,分別用來返回Oracle的錯誤代碼和錯誤消息。 MYSQL: 可以從JAVA中得到錯誤代碼,錯誤狀態和錯誤消息 |
28 | SQLERRM | MYSQL中沒有對應的函數,但JAVA中SQLException。getMessage()函數可以獲取錯誤消息 | Oracle內置函數SQLCODE和SQLERRM是特別用在OTHERS處理器中,分別用來返回Oracle的錯誤代碼和錯誤消息。 MYSQL: 可以從JAVA中得到錯誤代碼,錯誤狀態和錯誤消息 |
|
29 | SEQ_BK_DTL_OPT_INT_KEY.NEXTVAL | 自動增長列 | 在MYSQL中是自動增長列. 如下方法獲取最新ID: START TRANSACTION; INSERT INTO user(username,password) VALUES (username,MD5(password)); SELECT LAST_INSERT_ID() INTO id; COMMIT; |
|
30 | SUM(enable_flag) | SUM(enable_flag) | 一樣: ORCALE: SELECT SUM(enable_flag) FROM SD_USR; MYSQL: SELECT SUM(enable_flag) FROM SD_USR; |
|
31 | DBMS_OUTPUT.PUT_LINE(SQLCODE) | 在MYSQL中無相應的方法,其作用是在控制台中打印,用於測試,對遷移無影響。 | db |
四、其他差別
1、在mysql5.6版本中,刪除數據的時候不能加入別名,在Oracle中這樣是可以的。
delete from Wooyun_Threat_Info w where w.wooyunId ='efg'; delete from Wooyun_Threat_Info as w where w.wooyunId ='efg'; #這兩種都是錯誤的,
若想加入別名則可以用下面的方式
delete from w using Wooyun_Threat_Info w where w.wooyunId ='10' delete w from Wooyun_Threat_Info w where w.wooyunId ='11';
2、對於Oracle與mysql主鍵增長的問題
Oracle : select seq_vul_risk_task_info.nextval as taskid from dual mysql : select max(auto_increment) from information_schema.TABLES where table_name='vul_risk_task_info' #由於有時候在mysql里面auto_increment的值可能不止一個,所以就要取最大值。
但是對於Oracle來說每調用一次.nextval后,序列值就會加1,而mysql卻沒有若也想達到此目的,需要以下設置自增值。
alter table xx表名 AUTO_INCREMENT = yyy #yyy一定得是正整數才可以,這個是設置xx表的自增值。
1,oracle沒有offet,limit,在mysql中我們用它們來控制顯示的行數,最多的是分頁了。oracle要分頁的話,要換成rownum。
2,oracle建表時,沒有auto_increment,所有要想讓表的一個字段自增,要自己添加序列,插入時,把序列的值,插入進去。
3,oracle有一個dual表,當select后沒有表時,加上的。不加會報錯的。select 1 這個在mysql不會報錯的,oracle下會。select 1 from dual這樣的話,oracle就不會報錯了。
4,對空值的判斷,name != ""這樣在mysql下不會報錯的,但是oracle下會報錯。在oracle下的要換成name is not null
5,oracle下對單引號,雙引號要求的很死,一般不准用雙引號,用了會報
ERROR at line 1:
ORA-00904: "t": invalid identifier
而mysql要求就沒有那么嚴格了,單引號,雙引號都可以。
6,oracle有to_number,to_date這樣的轉換函數,oracle表字段是number型的,如果你$_POST得到的參數是123456,入庫的時候,你還要to_number來強制轉換一下,不然后會被當成字符串來處理。而mysql卻不會。
7,group_concat這個函數,oracle是沒有的,如果要想用自已寫方法。
8,mysql的用戶權限管理,是放到mysql自動帶的一個數據庫mysql里面的,而oracle是用戶權限是根着表空間走的。
9,group by,在下oracle下用group by的話,group by后面的字段必須在select后面出現,不然會報錯的,而mysql卻不會。
10,mysql存儲引擎有好多,常用的mysiam,innodb等,而創建oracle表的時候,不要這樣的,好像只有一個存儲引擎。
11,oracle字段無法選擇位置,alter table add column before|after,這樣會報錯的,即使你用sql*plus這樣的工具,也沒法改字段的位置。
12,oracle的表字段類型也沒有mysql多,並且有很多不同,例如:mysql的int,float合成了oracle的number型等。
13,oracle查詢時from 表名后面 不能加上as 不然會報錯的,select t.username from test as t而在mysql下是可以的。
14,oracle中是沒有substring這個函數的,mysql有的。