SQLServer转成Mysql数据库的方法

2019-08-23 07:30:23来源:爱站网 阅读 ()

新老客户大回馈,云服务器低至5折

关于SQLServer转成Mysql数据库的方法可能已经不是什么新鲜话题了,现在我们也可以在网上搜索到很多的方法,那么我们今天就跟小编一起看看不一样的方法吧,感兴趣的小伙伴们收藏起来吧。

由于2个系统数据库结构差异非常大,不方便采取SQL?SERVER里导入MYSQL的ODBC数据源的功能(也不推荐这么做,字段类型等不同点会搞死人的~),因此就在WINDOWS下自己写PHP脚本从SQLSERVER里读数据,然后按照新系统的需要处理之后插入MYSQL里面,灵活也比较方便。实际过程主要有下面几个问题:

1、数据库的连接,主要是连接SQL?SERVER。主要有3种方法:
1.1?利用PHP中的mssql_系列函数,这个与使用mysql_系列函数类似,不过要打开php.ini中相关扩展(extension=php_mssql.dll)。
1.2?利用ODBC连接,由于抽象了具体数据库,所以没有办法利用数据表字段名=>数组键名的特性,在针对具体应用时不是很方便,代码形式:

$conn?=?odbc_connect("datasource","username","password");
$sql?=?"select?*?from?news";
$cur=?odbc_exec($conn,?$sql);
while(odbc_fetch_row($cur)){
????$field1?=?odbc_result($cur,1);
????$field2?=?odbc_result($cur,2);
//do?something
}
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=new?PDO("mssql:dbname=XXX;host=localhost",?
"root",?"password");//Connect?to?DB
}?catch?(PDOException?$e)?{
????print?"Error!:?"?.?$e->getMessage();//Error?Message
????die();
}
$stmt?=?$DBH->prepare("SELECT?*?FROM?news");//Stmt?Handle?$stmt
if?($stmt->execute())?{
????while?($row?=?$stmt->fetch())?{
????????//do?something
????}
}
$stmt2?=?$mssql->prepare("INSERT?INTO?news?
(title,author)?VALUES?(:title,?:author)");
$stmt2->bindParam(':title',?$title);
$stmt2->bindParam(':author',?$author);
$stmt2->execute();
$DBH?=?null;//?Close?Connection这里要提醒下的是MSSQL里面是没有MYSQL中LIMIT这个语法的。

2、TEXT字段被截断的问题。
上面尝试了3种连接数据库方法,是因为当初连上MSSQL后SELECT出来的数据总是只有4K长度,以为是连接方式限制导致的,所以换了几种都是这样,最后查了资料才知道,是php.ini里面这2句配置的问题:
;?Valid?range?0?-?2147483647.?Default?=?4096.
mssql.textlimit?=?4096

;?Valid?range?0?-?2147483647.?Default?=?4096.
mssql.textsize?=?4096
把4096改成-1(代表无限制)即可,也可以使用mssql_query("SET?TEXTSIZE?65536");来实现。

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"(有些奇怪,不知道为什么会产生中文)。用下面这个函数可以转换成时间戳:

function?ConvertTime($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];
????}
????//return?date("Y-m-d?H:i:s",mktime($h,$i,$s,$month,$day,$year));
????return?mktime($h,$i,$s,$month,$day,$year);
}最后转换脚本写完了可以在CMD窗口里面用php.exe?abc.php来执行,这种方式是没有超时时间的,适合迁移大批量数据。
基本上就是这些内容,希望对大家有帮助。?

Update(06/05/05):关于时间戳的转换,在php.ini中加上
mssql.datetimeconvert?=?Off
后就能得到类似2006-01-01?12:01不带有中文的格式了。

以上就是SQLServer转成Mysql数据库的方法,我们需要先将数据库移至本地SQLServer,然后在根据上文中的方法将SQLServer转换成Mysql数据库。


原文链接:https://js.aizhan.com/data/mysql/8241.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:mysql出现Error performing load command怎么办

下一篇:深入学习MySQL事务:ACID特性的实现原理