標籤:
ares-sdk初始開發測試使用的是oracle資料庫,由於寧波通商的特殊需要,必須把資料庫環境從oracle轉向mysql。 現對轉換過程中出現的問題及經驗總結如下:
主鍵建置原則
建立一個專門記錄序列的表sequence,記錄有當前序號,序列的間隔如+1
建立記錄當前序列的表DROP TABLE IF EXISTS sequence;CREATE TABLE sequence (name VARCHAR(50) NOT NULL,current_value INT NOT NULL,increment INT NOT NULL DEFAULT 1,PRIMARY KEY (name)) ENGINE=InnoDB;INSERT INTO sequence VALUES (‘MovieSeq‘,3,5);
建立一個擷取當前序列的functionDROP FUNCTION IF EXISTS currval;CREATE FUNCTION currval (seq_name VARCHAR(50))RETURNS INTEGERCONTAINS SQLBEGIN DECLARE value INTEGER; SET value = 0; SELECT current_value INTO value FROM sequence WHERE name = seq_name; RETURN value;END;
擷取下一個數值..先在sequence裡面調用update當前最大數值+1然後再調用currval獲得當前數值DROP FUNCTION IF EXISTS nextval;DELIMITER $CREATE FUNCTION nextval (seq_name VARCHAR(50))RETURNS INTEGERCONTAINS SQLBEGIN UPDATE sequence SET current_value = current_value + increment WHERE name = seq_name; RETURN currval(seq_name);END$DELIMITER ;
DROP FUNCTION IF EXISTS setval;DELIMITER $CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)RETURNS INTEGERCONTAINS SQLBEGIN UPDATE sequence SET current_value = value WHERE name = seq_name; RETURN currval(seq_name);END$DELIMITER ;
如果以上語句執行有異常請先執行這句:set global logbintrustfunctioncreators=TRUE;
插入時的主鍵產生:
mysql: SELECT MMC.NEXTVAL(‘SEQ_MD_ENTITY_ATTRIBUTE‘)oracle: select MMC.SEQ_MD_ENTITY_ATTRIBUTE.nextval from dual
日期處理
mysql : DATE_FORMAT(NOW(),‘%Y-%m-%d %H:%i:%s‘)oracle: TO_CHAR(SYSDATE,‘YYYY-MM-DD hh24:mi:ss‘)
nvl函數
mysql: ifnull(A.USER_KPI,0)oracle: NVL(A.USER_KPI,0)
to_number
oracle 的 to_numbermysql不需要
關鍵字、保留字
涉及到關鍵字,mysql關鍵字需要加上``號mysql: PARA_VALUE as `KEY` oracle : PARA_VALUE as KEY
rownum
Unknown column ‘rownum‘ in ‘where clause‘oracle自訂sql中如果使用了rownum=1 mysql中可以寫成limit 1
大小寫問題
在oracle中一般情況下不區分大小寫但在MySQL中,所使用作業系統的大小寫敏感性決定了資料庫名和表名的大小寫敏感性。解決的辦法是把mysql的資料庫名和oracle的大小寫保持一致,表名與應用程式中sql字串中的表名保持一致,如果應用程式中欄位名用了雙引號,那請把sql中的欄位名大小寫與雙引號裡的字元保持一致。如果你的應用程式所引用的表名、欄位沒有統一大小寫,那麻煩就大了。
字串截取
mysql: 截取log_data從逗號開始之後的字元:SELECT substring_index(log_data,‘,‘,-1) FROM nbts.log where event_id=‘150002‘ and log_id =‘a2a421734c7e47dd8a8b‘;截取log_data從逗號開始之前的字元:SELECT substring_index(log_data,‘,‘,1) FROM nbts.log where event_id=‘150002‘ and log_id =‘a2a421734c7e47dd8a8b‘;oracle : 截取log_data從逗號開始之後的字元:SELECT SUBSTR(log_data, INSTR(log_data, ‘,‘, 1, 1) +1) AS app_ver_id FROM nbts.log where event_id=‘150002‘ and log_id =‘a2a421734c7e47dd8a8b‘;截取log_data從逗號開始之前的字元:SELECT SUBSTR(log_data,0,INSTR(log_data, ‘,‘, 1, 1) - 1) AS app_ver_id FROM nbts.log where event_id=‘150002‘ and log_id =‘a2a421734c7e47dd8a8b‘;
字串格式化
mysql:CONCAT oracle:TO_CHAR
主鍵長度問題
在遷移到mysql後可能會出現主鍵長度太短,需要增加長度。
http://www.cnblogs.com/kunpengit/p/4462656.html
oracle轉mysql總結(轉)