第一種是安裝mysql ODBC
利用sql server的導出功能
選擇mysql數據源
進行數據的直接導出
這種方法很簡便
但是針對實際應用有很多弊端
最主要體現就是數據類型問題
首先
sql server數據庫中的ntext
image等數據類型的數據無法直接寫入到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(
localhost
root
);// 連接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
(id
name
username
password
recdate)
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;
}
?>
將該段腳本存成sql
php
在服務器上執行
就可以將服務器上sql server中mydb數據庫的user表中的數據導入到mysql中mydb數據庫的user表中去
其他表的操作與此雷同
就不贅述了
下面再介紹一下asp腳本實現sql server中mydb數據庫的數據向mysql中mydb數據庫導入
<%
set conn=server
createobject(
nnection
)
conn
open
web
admin
//
web
是sqlserver中mydb的數據源名
admin
是訪問mydb的用戶名
是訪問mydb的密碼
set rs=server
createobject(
adodb
recordset
)
sql=
select ID
name
username
password
datediff(s
:
:
recdate)
*
reid
filename
fileContentType
filevalue from senddate
//這條sql語句實現了將datetime類型的recdate字段轉化成unix時間戳的int型
rs
open sql
conn
set conn
=server
createobject(
nnection
)
conn
open
myoa
root
q
d
=
?
i=
do while not rs
eof
field
= rs(
)
field
= rs(
)
field
= rs(
)
field
= rs(
)
field
= rs(
)
sql
=
insert into user(ID
name
username
password
recdate)
values(
&field
&
&field
&
&field
&
&field
&
&field
&
)
conn
execute sql
rs
movenext
i=i+
loop
rs
close
set rs=nothing
conn
close
set conn=nothing
conn
close
set conn
=nothing
%>
以上兩個是分別采用php腳本和asp腳本對user表的數據進行由sql server到mysql的導入其間我采用
種回避的方法來避免ntext
image類型數據的傳遞
一種是將ntext字段改為nvarchar(
)
因為實際情況
原始數據中該字段的數據長度都未超過
個字
所以並沒有出現數據截斷
另一個手段是將image類型數據取出來寫到文件中
以文件形式保存
將文件路徑存到數據庫中
方法見下
function makeattach(fileContentType
filevalue
i)
select case fileContentType
case
application/msword
ext=
doc
case
application/vnd
ms
excel
ext=
exl
case
application/vnd
ms
powerpoint
ext=
pps
case
application/x
rar
compressed
ext=
rar
case
application/x
zip
compressed
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=server
createobject(
FileSystemObject
)
fName=
attech
&i&
&ext
Dir=
d:\attach\
If fso
FileExists(Dir & fName) Then fso
deletefile Dir & fName
If fName<>
AND NOT fso
FileExists(Dir & fName) Then
Set strm
=Server
CreateObject(
ADODB
Stream
)
strm
Open
strm
Type=
Binary
strm
Write filevalue
strm
SaveToFile 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