將數據從MySQL遷移到Oracle的註意事項

来源:http://www.cnblogs.com/xJerry/archive/2016/11/06/6036427.html
-Advertisement-
Play Games

將數據從MySQL遷移到Oracle的註意事項1.自動增長的數據類型處理MYSQL有自動增長的數據類型,插入記錄時不用操作此欄位,會自動獲得數據值。ORACLE沒有自動增長的數據類型,需要建立一個自動增長的序列號,插入記錄時要把序列號的下一個值賦於此欄位。CREATE SEQUENCE 序列號的名稱 ...


將數據從MySQL遷移到Oracle的註意事項


1.自動增長的數據類型處理
MYSQL有自動增長的數據類型,插入記錄時不用操作此欄位,會自動獲得數據值。ORACLE沒有自動增長的
數據類型,需要建立一個自動增長的序列號,插入記錄時要把序列號的下一個值賦於此欄位。
CREATE SEQUENCE 序列號的名稱 (最好是表名+序列號標記)
INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;
INSERT 語句插入這個欄位值為: 序列號的名稱.NEXTVAL


2. 單引號的處理
MYSQL里可以用雙引號包起字元串,ORACLE里只可以用單引號包起字元串。在插入和修改字元串前必須做
單引號的替換:把所有出現的一個單引號替換成兩個單引號。當然你如果使用 Convert Mysql to Oracle
工具就不用考慮這個問題


3.長字元串的處理
在ORACLE中,INSERT和UPDATE時最大可操作的字元串長度小於等於4000個單位元組, 如果要插入更長的字元
串, 請考慮欄位用CLOB類型,方法借用ORACLE里自帶的DBMS_LOB程式包。插入修改記錄前一定要做進行非
空和長度判斷,不能為空的欄位值和超出長度欄位值都應該提出警告,返回上次操作。


4. 翻頁的SQL語句的處理
MYSQL處理翻頁的SQL語句比較簡單,用LIMIT 開始位置, 記錄個數。ORACLE處理翻頁的SQL語句就比較繁瑣
了。每個結果集只有一個ROWNUM欄位標明它的位置, 並且只能用ROWNUM<100, 不能用ROWNUM>80。


以下是經過分析後較好的兩種ORACLE翻頁SQL語句(ID是唯一關鍵字的欄位名):
語句一:
SELECT ID, FIELD_NAME,.. .
FROM TABLE_NAME
WHERE ID IN (SELECT ID
FROM (SELECT ROWNUM AS NUMROW, ID
FROM TABLE_NAME
WHERE 條件1
ORDER BY 條件2)
WHERE NUMROW > 80
AND NUMROW < 100)
ORDER BY 條件3;
語句二:
SELECT *
FROM ((SELECT ROWNUM AS NUMROW, c.*
from (select FIELD_NAME,.. .
FROM TABLE_NAME
WHERE 條件1
ORDER BY 條件2) c) WHERE NUMROW > 80 AND NUMROW < 100)
ORDER BY 條件3;


5. 日期欄位的處理
MYSQL日期欄位分DATE和TIME兩種,ORACLE日期欄位只有DATE,包含年月日時分秒信息,用當前資料庫的
系統時間為SYSDATE, 精確到秒。
日期欄位的數學運算公式有很大的不同。
MYSQL找到離當前時間7天用:DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)
ORACLE找到離當前時間7天用:DATE_FIELD_NAME >SYSDATE - 7;


6. 字元串的模糊比較
MYSQL里用 欄位名 like '%字元串%',ORACLE里也可以用 欄位名 like '%字元串%' 但這種方法不能使用
索引, 速度不快,用字元串比較函數 instr(欄位名,'字元串')>0 會得到更精確的查找結果。


7. 空字元的處理
MYSQL的非空欄位也有空的內容,ORACLE里定義了非空欄位就不容許有空的內容。按MYSQL的NOT NULL來定
義ORACLE表結構, 導數據的時候會產生錯誤。因此導數據時要對空字元進行判斷,如果為NULL或空字元,
需要把它改成一個空格的字元串。

Oracle移植到mysql註意事項
客戶用的資料庫是mysql,而研發好的產品支持oracle,我們必須把資料庫環境從oracle移植到mysql。在
移植的過程中碰到了下麵一些問題,如果我們在最初的設計、編碼過程中註意資料庫的移植性,這種情況
下可以完全不需要作額外工作。


一、資料庫環境從oracle移植到mysql碰到的問題。
1、 大小寫敏感的區別(如果伺服器OS是linux)。
在oracle中一般情況下不區分大小寫。有時候我們在使用oracle不註意大小寫的問題,表名和欄位名不加
雙引號是不區分大小寫的,像這樣:insert into tableName 和 insert into TABLENAME效果是一樣的,
用工具導出創建/數據初始化腳本,得到的結果一般表名和欄位名轉化成了大寫。


但在MySQL中,所使用操作系統的大小寫敏感性決定了資料庫名和表名的大小寫敏感性。資料庫對應數據
目錄中的目錄,資料庫中的每個表至少對應資料庫目錄中的一個文件(也可能是多個,取決於存儲引擎)。
因此,使用資料庫或表實際上是操縱這些文件(夾),所以使用操作系統的大小寫敏感性決定了資料庫名和
表名的大小寫敏感性。在以linux為內核的操作系統中是大小寫敏感的。


解決的辦法,是把mysql的資料庫名和oracle的大小寫保持一致,表名與應用程式中sql字元串中的表名保持
一致,如果應用程式中欄位名用了雙引號,那請把sql中的欄位名大小寫與雙引號里的字元保持一致。如果
你的應用程式所引用的表名、欄位沒有統一大小寫,那麻煩就大了。


2、保留字的區別。
像sql語言的函數名(如:inteval,show)等是保留字。Oracle中保留字是可以作為表名和欄位名,並且不
影響使用,但mysql中保留字是不能作為表名和欄位名,如果使用會報語法錯誤。


解決辦法,把sql語句中的保留字用‘`’符號引起來,這個符號位於鍵盤的tab鍵上面;如果是欄位名還有另
外一種方法tablename.欄位名。像這樣:
insert into tablename (id, `interval`) value(…..

insert into tablename (id, tablename.inteval) value(…..


3、自動增長類型的區別。
Oracle有sequence,mysql中沒有,但有auto_increment屬性。


解決辦法是把Oracle中sequence轉換成使用auto_increment屬性,某些情況可能還有一種辦法可以解決
問題,新建一個獨立的表用來專門記錄自動增長型的數據。


4、數據類型的區別。
在mysql中沒有像oracle中的varchar2、number,mysql有與之對應的varchar、numeric,當然在oracle中沒有mysql的time類型。


解決辦法是替換。


5、索引長度限制的區別。
從MySQL 4.1.2開始,MyISAM和InnoDB表索引長度支持1000位元組,也就是說索引欄位的長度不能超過1000
位元組,如果超過會報這樣的錯:
ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes。
如果是UTF-8編碼,相當於333個字元的長度(因為UTF8一個字元占3個位元組)。Oracle的索引長度限制比mysql要寬鬆得多。


解決的辦法就不必要多說了,要麼改索引的定義,要麼改欄位的定義長度。


二、為了資料庫的相容性我們應該註意些什麼。
資料庫的相容性應該是資料庫設計應該重視的一個問題,因為有時候客戶存在已經在用的資料庫,並且
不希望同時維護兩個資料庫,這樣的話相容多種資料庫還能成為產品的一個賣點。


作到資料庫的相容性關鍵是遵守標準用法。


1、 遵守標準用法,儘量不使用某種資料庫特有的用法。
如msyql的‘`’符號的用法,
再比如,很多人有這種用法,
在使用oracle開發的時候創建sequence,往表中插數據之前先SELECT seq.nextval FROM DUAL;,
然後把查詢得到的值作為value插入表中,這種用法沒法適應沒有sequence的資料庫,每個資料庫都有自
動增長型的用法,如果需要使用就應該完全地使用。
再舉個例子,不同的資料庫對分頁查詢作了擴展,postgresql有offset,limit,oracle就沒有。


2、 保留字。
要求資料庫設計者儘量不使用保留字作表名和欄位名。也有很多人有這種用法,在表名和欄位名前加‘_’,
像這樣:create table _tablename ( _id integer)。這樣永遠不會出現保留字引起的問題。


3、 避免資料庫大小寫敏感的問題。
選擇資料庫表名和欄位名採用大寫還是小寫,並且在資料庫的設計和編碼過程中完全統一。
當使用 Convert Oracle to Mysql 工具時,請註意“名稱轉換為大寫”這個選項的控制


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • mysql-5.6.14-win32為免安裝解壓縮版,安裝版(http://dev.mysql.com/downloads/installer/5.5.html#downloads)存在很多弊端。mysql 5.6.14 win7 32位免安裝版配置1.下載mysql 5.6.14;下載地址:htt ...
  • 搭建完《hadoop偽分散式平臺》後就開始搭建hbase偽分散式平臺了。有了hadoop環境,搭建hbase就變得很容易了。 一、Hbase安裝 1、從官網下載最新版本Hbase安裝包1.2.3,為了省去編譯安裝環節,我直接下載了hbase-1.2.3-bin.tar.gz,解壓即可使用。(如果此鏈 ...
  • 版權聲明:本文發佈於http://www.cnblogs.com/yumiko/,版權由Yumiko_sunny所有,歡迎轉載。轉載時,請在文章明顯位置註明原文鏈接。若在未經作者同意的情況下,將本文內容用於商業用途,將保留追究其法律責任的權利。如果有問題,請以郵箱方式聯繫作者(793113046@q ...
  • DROP PROCEDURE IF EXISTS `SP_MODEL`; DELIMITER ;;CREATE PROCEDURE `SP_MODEL`(IN V_TYPE INT)BEGIN /**********存儲過程模版,結合了·返回自定義錯誤信息·錯誤退出··事物回滾·的功能******* ...
  • SQL Union和SQL Union All用法 SQL UNION 操作符 UNION 操作符用於合併兩個或多個 SELECT 語句的結果集。 請註意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同。 S ...
  • 介紹 子分區其實是對每個分區表的每個分區進行再次分隔,目前只有RANGE和LIST分區的表可以再進行子分區,子分區只能是HASH或者KEY分區。子分區可以將原本的數據進行再次的分區劃分。 一、創建子分區 子分區由兩種創建方法,一種是不定義每個子分區子分區的名字和路徑由分區決定,二是定義每個子分區的分 ...
  • http://www.jxedt.com/wen/xuefei/3174969463387127833.html http://www.jxedt.com/wen/xuefei/3174969467804123151.html http://www.jxedt.com/wen/xuefei/3174 ...
  • 1.1 SVM 概念 支持向量機SVM是一種原創性(非組合)的具有明顯直觀幾何意義的分類演算法,具有較高的準確率。源於Vapnik和Chervonenkis關於統計學習的早期工作(1971年),第一篇有關論文由Boser、Guyon、Vapnik發表在1992年。思想直觀,但細節異常複雜,內容涉及凸分 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...