找到一种不错的从SQLServer转成Mysql数据库的方法
2007-10-30 11:02:05 来源:WEB开发网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不带有中文的格式了。
- ››SQLServer 游标简介与使用说明
- ››sqlserver游标概念与实例全面解说
- ››SqlServer性能优化——Slide Window
- ››SqlServer性能优化:Partition(创建分区)
- ››SqlServer性能优化:Partition(管理分区)
- ››SQLServer2005中的uniqueidentifier数据类型与NEW...
- ››SQLServer 2005 常用的函数
- ››SqlServer的timestamp数据类型
- ››sqlserver动态交叉表的范例
- ››SQLServer索引调优实践
- ››SQLServer索引调优实践(2) - 索引覆盖
- ››SQLServer数据库中如何保持数据一致性
更多精彩
赞助商链接