第一种是安装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的数据库中保存