服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|

服务器之家 - 数据库 - Mysql - 找到一种不错的从SQLServer转成Mysql数据库的方法

找到一种不错的从SQLServer转成Mysql数据库的方法

2019-10-18 16:25mysql技术网 Mysql

年初的时候一直在做一个网站MSSQL2000-MySQL5的迁移工作,因为采用了不同的程序系统,所以主要问题在数据的迁移。由于2个系统 数据库 结构差异非常大,不方便采取SQLSERVER里导入MYSQL的ODBC数据源的功能(也不推荐这么做,字段类型

年初的时候一直在做一个网站MSSQL2000 -> MySQL5的迁移工作,因为采用了不同的程序系统,所以主要问题在数据的迁移。由于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不带有中文的格式了。

延伸 · 阅读

精彩推荐
  • MysqlMysql修改server uuid的方法分享

    Mysql修改server uuid的方法分享

    这篇文章主要给大家介绍了关于Mysql修改server uuid的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    Pratise2672019-06-27
  • Mysql有关SQL模糊查询

    有关SQL模糊查询

    在进行数据库查询时,有完整查询和模糊查询之分,这里简单介绍下,方便需要的朋友 ...

    mysql教程网1892019-10-16
  • Mysqlgetdata table表格数据join mysql方法

    getdata table表格数据join mysql方法

    今天小编就为大家分享一篇关于getdata table表格数据join mysql方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小...

    我是高手高手高高手2002019-06-04
  • Mysqlcentos7通过yum安装mysql的方法

    centos7通过yum安装mysql的方法

    这篇文章主要介绍了centos7通过yum安装mysql的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下...

    千雨猫1732019-06-17
  • MysqlMySQL数据库监控软件lepus使用问题以及解决办法

    MySQL数据库监控软件lepus使用问题以及解决办法

    这篇文章主要介绍了MySQL数据库监控软件lepus使用问题及解决办法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下...

    coe2coe2742019-06-22
  • MysqlMySQL5.6的zip包安装教程详解

    MySQL5.6的zip包安装教程详解

    这篇文章主要介绍了MySQL5.6的zip包安装教程,需要的朋友可以参考下...

    4392019-06-15
  • MysqlMySQL约束类型及举例介绍

    MySQL约束类型及举例介绍

    今天小编就为大家分享一篇关于MySQL约束类型及介绍的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来...

    no-961722019-06-19
  • Mysqlmysql 获取今天、昨天0点时间戳的实例

    mysql 获取今天、昨天0点时间戳的实例

    今天小编就为大家分享一篇mysql 获取今天、昨天0点时间戳的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    弄月3842019-07-15