时间:2021-07-01 10:21:17 帮助过:26人阅读
找到一种不错的从SQLServer转成Mysql数据库的方法
年初的时候一直在做一个网站MSSQL2000 -> MySQL5的迁移工作,因为采用了不同的程序系统,所以主要问题在数据的迁移。由于2个系统数据库结构差异非常大,不方便采取SQL SERVER里导入MYSQL的ODBC数据源的功能(也不推荐这么做,字段类型等不同点会搞死人的~),因此就在WINDOWS下自己写PHP脚本从SQLSERVER里读数据,然后按照新系统的需要处理之后插入MYSQL里面,灵活也比较方便。实际过程主要有下面几个问题:
- <br><br>try { <br> $DBH=new PDO("mssql:dbname=XXX;host=localhost", <br>"root", "password");//Connect to DB <br>} catch (PDOException $e) { <br> print "Error!: " . $e->getMessage();//Error Message <br> die(); <br>} <br>$stmt = $DBH->prepare("SELECT * FROM news");//Stmt Handle $stmt <br>if ($stmt->execute()) { <br> while ($row = $stmt->fetch()) { <br> //do something <br> } <br>} <br>$stmt2 = $mssql->prepare("INSERT INTO news <br>(title,author) VALUES (:title, :author)"); <br>$stmt2->bindParam(':title', $title); <br>$stmt2->bindParam(':author', $author); <br>$stmt2->execute(); <br>$DBH = null;// Close Connection这里要提醒下的是MSSQL里面是没有MYSQL中LIMIT这个语法的。 <br><br>2、TEXT字段被截断的问题。 <br>上面尝试了3种连接数据库方法,是因为当初连上MSSQL后SELECT出来的数据总是只有4K长度,以为是连接方式限制导致的,所以换了几种都是这样,最后查了资料才知道,是php.ini里面这2句配置的问题: <br>; Valid range 0 - 2147483647. Default = 4096. <br>mssql.textlimit = 4096 <br><br>; Valid range 0 - 2147483647. Default = 4096. <br>mssql.textsize = 4096 <br>把4096改成-1(代表无限制)即可,也可以使用mssql_query("SET TEXTSIZE 65536");来实现。 <br><br>3.两种数据库字段类型不同的问题有2个地方需要讲一下,一个是字段支持最大长度要注意,以免插入数据库时候被截断,另外一个就是日期格式的问题了,我比较喜欢用UNIX时间戳。在连MSSQL时候可以用 "select unix_timestamp(created) from news" 来实现MSSQL里面DATETIME到MYSQL里时间戳的转换。不过迁移时候一次要提取表中所有字段,像上面这种方法就没有简单的"select * from news"简洁,需要罗列所有字段。实际可以直接SELECT出来,得到的是一个字符串,比如在MSSQL里面是2006-01-01 12:01,取出来的字符串是"2006 一月 01 12:01"(有些奇怪,不知道为什么会产生中文)。用下面这个函数可以转换成时间戳: <br><br>function ConvertTime($timestring){ <br> if($timestring == null){ <br> return 0; <br> } <br> $time = explode(" ",$timestring); <br> $year = $time[0]; <br> switch ($time[1]){ <br> case "一月":$month = "1";break; <br> case "二月":$month = "2";break; <br> case "三月":$month = "3";break; <br> case "四月":$month = "4";break; <br> case "五月":$month = "5";break; <br> case "六月":$month = "6";break; <br> case "七月":$month = "7";break; <br> case "八月":$month = "8";break; <br> case "九月":$month = "9";break; <br> case "十月":$month = "10";break; <br> case "十一月":$month = "11";break; <br> case "十二月":$month = "12";break; <br> default:break; <br> } <br> $day = $time[2]; <br> $h = 0; <br> $m = 0; <br> $s = 0; <br> if(!empty($time[3])){ <br> $time2 = explode(":",$time[3]); <br> $h = $time2[0]; <br> $i = $time2[1]; <br> } <br> //return date("Y-m-d H:i:s",mktime($h,$i,$s,$month,$day,$year)); <br> return mktime($h,$i,$s,$month,$day,$year); <br>}最后转换脚本写完了可以在CMD窗口里面用php.exe abc.php来执行,这种方式是没有超时时间的,适合迁移大批量数据。 <br>基本上就是这些内容,希望对大家有帮助。 <br><br>Update(06/05/05):关于时间戳的转换,在php.ini中加上 <br>mssql.datetimeconvert = Off <br>后就能得到类似2006-01-01 12:01不带有中文的格式了。