1、表空間 mysql
mysql的表空間有共享表空間和獨佔表空間,獨佔表空間,其實就是一張表一個表空間,其實也就是一張表一個數據文件,共享表空間彷佛有點相似oracle的表空間,不一樣的表能夠保存在同一個數據文件裏,通常mysql沒有單首創建表空間的步驟而oracle要先建立好表空間,而後指定某張表放到某個表空間。
sql
2、數據類型數據庫
一、oracle表結構移植到mysql中須要的類型轉換session
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
二、mysql和oracle數據類型對應關係參照表oracle
MySQL Data Typeide |
Oracle Data Type函數 |
BIGINT工具 |
NUMBER(19, 0)sqlserver |
BITpost |
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 |
3、經常使用函數比較
一、返回當前時間的時間戳。
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()))
二、日期前一天
Oracle : sysdate - 1; mysql : date_sub(curdate(),interval 1 day);
三、trim函數
trim(' xxxx ')、ltrim(' xxxx ')、rtrim(' xxxx ') #Oracle與mysql用法一致都是去除兩邊、左邊、右邊的空格。
Oracle
trim('1112222667671122','12') 、ltrim('1112222667671122','12')、rtrim('1112222667671122','12') #oracle用法是去除兩邊開始、左邊開始、右邊開始起的全部包含第二個字符串中的字符,因此結果爲6676七、66767112二、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 |
4、其餘差異
一、在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';
二、對於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有的。