收藏 分销(赏)

一种不错的从SQL转Mysql数据库的方法.doc

上传人:xrp****65 文档编号:7702343 上传时间:2025-01-13 格式:DOC 页数:3 大小:28KB
下载 相关 举报
一种不错的从SQL转Mysql数据库的方法.doc_第1页
第1页 / 共3页
一种不错的从SQL转Mysql数据库的方法.doc_第2页
第2页 / 共3页
点击查看更多>>
资源描述
年初的时候一直在做一个网站MSSQL2000->MySQL5的迁移工作,因为采用了不同的程序系统,所以主要问题在数据的迁移。由于2个系统数据库结构差异非常大,不方便采取SQLSERVER里导入MYSQL的ODBC数据源的功能(也不推荐这么做,字段类型等不同点会搞死人的~),因此就在WINDOWS下自己写PHP脚本从SQLSERVER里读数据,然后按照新系统的需要处理之后插入MYSQL里面,灵活也比较方便。实际过程主要有下面几个问题: 1、数据库的连接,主要是连接SQLSERVER。主要有3种方法: 1.1利用PHP中的mssql_系列函数,这个与使用mysql_系列函数类似,不过要打开php.ini中相关扩展(extension=php_mssql.dll)。 1.2利用ODBC连接,由于抽象了具体数据库,所以没有办法利用数据表字段名=>数组键名的特性,在针对具体应用时不是很方便,代码形式: $conn=odbc_connect("datasource","username","password"); $sql="select*fromnews"; $cur=odbc_exec($conn,$sql); while(odbc_fetch_row($cur)){ $field1=odbc_result($cur,1); $field2=odbc_result($cur,2); //dosomething } 1.3使用PDO-PHP5中加入数据对象抽象层,作为官方推出的数据访问接口,优点有很多,比如支持参数绑定以防止SQL注入;对于不同数据库加载不同驱动即可,程序代码是一致的,便于移植等等,相信应该是大势所趋。不过由于用了PHP5全新的面向对象特性,需要PHP5的支持,5.1可以直接使用,5需要装PECL,另外还要修改PHP.ini,增加:extension=php_pdo_mysql.dll和extension=php_pdo_mssql.dll,实际代码如下: try{ $DBH=newPDO("mssql:dbname=XXX;host=localhost",  "root","password");//ConnecttoDB }catch(PDOException$e){ print"Error!:".$e->getMessage();//ErrorMessage die(); } $stmt=$DBH->prepare("SELECT*FROMnews");//StmtHandle$stmt if($stmt->execute()){ while($row=$stmt->fetch()){ //dosomething } } $stmt2=$mssql->prepare("INSERTINTOnews  (title,author)VALUES(:title,:author)"); $stmt2->bindParam(':title',$title); $stmt2->bindParam(':author',$author); $stmt2->execute(); $DBH=null;//CloseConnection这里要提醒下的是MSSQL里面是没有MYSQL中LIMIT这个语法的。 2、TEXT字段被截断的问题。 上面尝试了3种连接数据库方法,是因为当初连上MSSQL后SELECT出来的数据总是只有4K长度,以为是连接方式限制导致的,所以换了几种都是这样,最后查了资料才知道,是php.ini里面这2句配置的问题: ;Validrange0-2147483647.Default=4096. mssql.textlimit=4096 ;Validrange0-2147483647.Default=4096. mssql.textsize=4096 把4096改成-1(代表无限制)即可,也可以使用mssql_query("SETTEXTSIZE65536");来实现。 3.两种数据库字段类型不同的问题有2个地方需要讲一下,一个是字段支持最大长度要注意,以免插入数据库时候被截断,另外一个就是日期格式的问题了,我比较喜欢用UNIX时间戳。在连MSSQL时候可以用"selectunix_timestamp(created)fromnews"来实现MSSQL里面DATETIME到MYSQL里时间戳的转换。不过迁移时候一次要提取表中所有字段,像上面这种方法就没有简单的"select*fromnews"简洁,需要罗列所有字段。实际可以直接SELECT出来,得到的是一个字符串,比如在MSSQL里面是2006-01-0112:01,取出来的字符串是"2006一月0112:01"(有些奇怪,不知道为什么会产生中文)。用下面这个函数可以转换成时间戳: functionConvertTime($timestring){ if($timestring==null){ return 0; } $time=explode("",$timestring); $year=$time[0]; switch($time[1]){ case"一月":$month="1";break; case"二月":$month="2";break; case"三月":$month="3";break; case"四月":$month="4";break; case"五月":$month="5";break; case"六月":$month="6";break; case"七月":$month="7";break; case"八月":$month="8";break; case"九月":$month="9";break; case"十月":$month="10";break; case"十一月":$month="11";break; case"十二月":$month="12";break; default:break; } $day=$time[2]; $h=0; $m=0; $s=0; if(!empty($time[3])){ $time2=explode(":",$time[3]); $h=$time2[0]; $i=$time2[1]; } //returndate("Y-m-dH:i:s",mktime($h,$i,$s,$month,$day,$year)); returnmktime($h,$i,$s,$month,$day,$year); } 最后转换脚本写完了可以在CMD窗口里面用php.exeabc.php来执行,这种方式是没有超时时间的,适合迁移大批量数据。 基本上就是这些内容,希望对大家有帮助。  Update(06/05/05):关于时间戳的转换,在php.ini中加上 mssql.datetimeconvert=Off 后就能得到类似2006-01-0112:01不带有中文的格式了。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服