熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> MySQL >> 正文

數據從sqlserver導入mysql數據庫的體驗

2013-11-12 23:40:21  來源: MySQL 

  第一種是安裝mysql ODBC利用sql server的導出功能選擇mysql數據源進行數據的直接導出這種方法很簡便但是針對實際應用有很多弊端最主要體現就是數據類型問題首先sql server數據庫中的ntextimage等數據類型的數據無法直接寫入到mysql數據庫中據說只要稍加改動就可以可惜偶這只菜鳥還沒想到如何改動其次因為偶在mysql中的數據庫設計中將時間都設成int型(保存的是時間戳)所以在數據導過來後就會出現沖突再次這種方法生成的mysql數據表的字段類型都不很合適所以此種方法我覺得不能提倡
  
  第二種是利用php或asp腳本來實現數據的導入功能這種方法需要編寫程序但靈活性大操作也不是那麼困難一切都盡在你的掌握之中現簡單介紹一下該方法前提條件是你的mysql環境已經搭建好了先建好目標數據庫再將所有的表結構用sql語句生成現在萬事具備只缺數據了
  
  可以通過下面的php腳本來實現sql server中mydb數據庫的user表中數據向mysql中mydb數據庫導入
  <?
  $cnx = odbc_connect(web admin );//web是sqlserver中mydb的數據源名admin是訪問mydb的用戶名是訪問mydb的密碼
  $cur= odbc_exec( $cnx select * from user );//打開sql server中mydb數據庫的user表
  $num_row=;
  $conn=mysql_pconnect(localhostroot);// 連接mysql
  @mysql_select_db(mydb$conn) or
  
  die(無法連接到數據庫請與管理員聯系!);//打開mysql的mydb數據庫
  while( odbc_fetch_row( $cur ))      //從sql server的mydb庫中的user表逐條取出數據如果對數據進行選擇可在前面的select語句中加上條件判斷
  {
   $num_row++;
   $field = odbc_result( $cur );  // 這裡的參數i()指的是記錄集中的第i個域你可以有所選擇地進行選取fieldi得到對應域的值然後你可以對fieldi進行操作
   $field = odbc_result( $cur ); 
   $field = odbc_result( $cur ); 
   $field = odbc_result( $cur ); 
   $field = odbc_result( $cur ); 
   $field = odbc_result( $cur ); 
   $field = timetoint($field);  //這裡是對sql server中的datetime類型的字段進行相應轉換處理轉換成我所需要的int型 
   $querystring = insert into user
           (idnameusernamepasswordrecdate)
          values($field$field$field$field$field) ;
  
   mysql_query($querystring$conn);
  }
  
  function timetoint($str){
   $arr=split( $str);
   $datestr=$arr[];
   $timestr=$arr[];
   $arr_date=split($datestr);
   $arr_time=split(:$timestr);
   $year=$arr_date[];
   $month=$arr_date[];
   $day=$arr_date[];
   $hour=$arr_time[];
   $minute=$arr_time[];
   $second=$arr_time[];
   $time_int=mktime($hour$minute$second$month$day$year);
   return $time_int;
  }
  ?>
  
  將該段腳本存成sqlphp在服務器上執行就可以將服務器上sql server中mydb數據庫的user表中的數據導入到mysql中mydb數據庫的user表中去其他表的操作與此雷同就不贅述了
  
  下面再介紹一下asp腳本實現sql server中mydb數據庫的數據向mysql中mydb數據庫導入
  <%
  set conn=servercreateobject(nnection)
  connopen web admin // web是sqlserver中mydb的數據源名admin是訪問mydb的用戶名是訪問mydb的密碼
  set rs=servercreateobject(adodbrecordset)
  sql=select IDnameusernamepassworddatediff(s ::recdate)*reidfilenamefileContentTypefilevalue from senddate //這條sql語句實現了將datetime類型的recdate字段轉化成unix時間戳的int型
  
  rsopen sqlconn
  set conn=servercreateobject(nnection)
  connopen myoarootqd=?
  i=
  do while not rseof
   field = rs() 
   field = rs() 
   field = rs() 
   field = rs() 
   field = rs() 
   sql = insert into user(IDnameusernamepasswordrecdate)    
  
  values(&field&&field&&field&&field&&field&)
  
  connexecute sql
  rsmovenext
  i=i+
  loop
  rsclose
  set rs=nothing
  connclose
  set conn=nothing
  connclose
  set conn=nothing
  
  %>
  
  以上兩個是分別采用php腳本和asp腳本對user表的數據進行由sql server到mysql的導入其間我采用種回避的方法來避免ntextimage類型數據的傳遞一種是將ntext字段改為nvarchar()因為實際情況原始數據中該字段的數據長度都未超過個字所以並沒有出現數據截斷另一個手段是將image類型數據取出來寫到文件中以文件形式保存將文件路徑存到數據庫中方法見下
  
  function makeattach(fileContentTypefilevaluei)
    select case fileContentType
      case application/msword
        ext=doc
  
      case application/vndmsexcel
        ext=exl
        
      case application/vndmspowerpoint
        ext=pps
        
      case application/xrarcompressed
        ext=rar
        
      case application/xzipcompressed
        ext=zip
        
      case image/gif
        ext=gif
        
      case image/pjpeg
        ext=jpg
        
      case text/plain
        ext=txt
        
      case else
        ext=x
        
    end select
    if ext<>x then
      set fso=servercreateobject(FileSystemObject)
      fName=attech&i&&ext
      Dir=d:\attach\
      If fsoFileExists(Dir & fName) Then fsodeletefile Dir & fName
      If fName<> AND NOT fsoFileExists(Dir & fName) Then
        Set strm=ServerCreateObject(ADODBStream)
        strmOpen
        strmType= Binary
        strmWrite filevalue
        strmSaveToFile Dir & fName
        Set strm=Nothing
      end if
      makeattach=fName
    end if
  end function
  
  這個函數有個輸入參數第一個是文件的contentType第二個是文件的二進制數值第三個是個可以區別文件名的變量先根據contentType確定所存文件的後綴名然後就是將二進制數值保存成指定文件名的文件並將文件名作為輸出參數返回將返回的參數作為數據寫到mysql的數據庫中保存
From:http://tw.wingwit.com/Article/program/MySQL/201311/11203.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.