当前位置: 首页 > 图文教程 > 数据库 > MYSQL > 一种不错的从SQL转Mysql数据库的方法

MYSQL
Mysql中mysqldump命令使用详解
常见mysql错误代码详细解析
设置 MySql 数据同步
MySQL集群配置
ASP连接MySQL数据库的方法
linux操作系统下建立mysql镜像数据库
加大MySql的最大连接数
使用"函数递归"实现基于php和MySQL的动态树型菜单
基于MySQL的高性能数据库应用开发
在同一台机器上运行多个MySQL服务器
从MySQL到ORACLE程序迁移的注意事项
安全专家讲解Mysql故障详细的诊断过程
Mysql中日期和时间函数应用不用求人
你可能不知道 Mysql的常用命令收集
您可能不知道 MySQL表最大能达到多少
mysql5中遭遇的字符集问题及其解决方案
教你轻松的掌握 MYSQL连接字符集和校对
快速的掌握可以运行MySQL的操作系统
在服务器上安装使用 MySQL 的注意事项
简简单单掌握对MySQL无效数据的约束

MYSQL 中的 一种不错的从SQL转Mysql数据库的方法


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 76 ::
收藏到网摘: n/a

年初的时候一直在做一个网站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连接,由于抽象了具体数据库,所以没有办法利用数据表字段名=>数组键名的特性,在针对具体应用时不是很方便,代码形式:

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不带有中文的格式了。