IIS PHP Sql Server搭配小记

研究了几天,问题终于都搞定了,今天就记录一下其中的关键点备忘。

步骤:

一,在Win2003 IIS6上配置PHP+MySQL环境

说起这个话题,我也是很久没动了,以前刚学php的时候也进行过很多次配置,本以为不是问题,谁知道搞了两天才弄好(当然中间穿插了其它工作要做)。以前记得PHP搭配IIS官方有一个msi的安装包,可以自动配置到IIS上。结果去官网一看,新版本的没有msi包了,都是压缩包,只有5.3及以下才有安装包。

第一次尝试以ISAPI方式搭配,没有成功,调试了几处配置,不知道是哪里问题。

于是下载了5.3的安装包,安装的时候选择了fastcgi方式,又一想IIS6还不支持fastcgi,需要去微软下载fastcgi软件,软件不大,安装也没问题,看了下说明,在系统盘有一个配置文件,只要在里面把php文件配置上就可以了。Php安装好,简单的测试phpinfo没问题,以为大功告成了,谁知道上网站一看,依旧是一片空白,看来是错误报不出来。于是继续找相关资料,看来还需要在php中设置几个fastcgi和cgi的参数。其实都是一些细节,只要严格按照官方的文档去做,基本上就没问题的,这里就不详细写了。因为我这里也只是测试的时候用,真正上线的时候撤掉旧的ASP系统,要把服务器换成Linux上线的。

下面是安装Mysql,这个本来没什么问题的,但是我下载了最新版本的Mysql,结果需要.net3.5还是4.0,于是又要下载.net,安装的时候又提示缺少个什么组件,果断放弃,选择了版本略低的Mysql,也没问题。

二,从旧的SQL Server数据库中导出数据到新的MySQL中,两套系统结构不一样,只是同一类型的平台,业务逻辑相似,但细节还是有很大差别的,所以,导入的时候只求基础业务逻辑没问题就行。

关键点一、PHP中连接SQL Server

PHP对数据库的支持还是很广泛的,包括了抽象层的ODBC,PDO等,以及对应数据库的支持,MySQL的Mysql,Mysqlnd,Mysqli,Oracle,MSSQL,IBM,Mongo等等。但是用的最多的还是MySQL,其它的也没怎么测试,总觉得原理都是一样,都没什么问题。今天要做这个MSSQL到MySQL数据的导入,才发现问题。

首先创建两个连接,一个连MSSQL,一个连MySQL,结果出错,mssql_connect不存在。这个简单,打开扩展选项。这下问题更大,PHP运行不起了,提示找不到扩展,一看ext目录下,php_mssql.dll没有了。这是什么情况?安装的版本不完整?于是去官方下载zip包,依旧没有。于是去官方手册查,简介页面写着

 

These functions allow you to access MS SQL Server database.
This extension is not available anymore on Windows with PHP 5.3 or later.
SQLSRV, an alternative extension for MS SQL connectivity is available from Microsoft: ? http://msdn.microsoft.com/en-us/sqlserver/ff657782.aspx.

看来是新版本PHP不提供mssql驱动了,而是由微软提供另外一套驱动。去微软下载驱动,其实就是个压缩包,有两个版本,一个针对5.2和5.3,另一个是5.3以上版本。里面有PDO和普通和驱动,分ntf和tf版本,还有说明手册。打开手册看了下,是另外一套函数,其实和其它数据库操作函数类似,配置好就可以使用了。

关键点二、脚本编写了个开头,先弄些测试数据试试,结果一导入进去,全是乱码。难道是gbk编码连接的?于是对中文字段手动用iconv转编码。也没什么大问题(其实是隐患)。

到后来脚本基本编写完成的时候测试,一直是有部分记录出错,出错的点也很奇怪,是在sqlsrv_query返回结果集,用sqlsrv_fetch_array取行的时候,引发的错误,文本提示是:字符串数据,右截断。网罗了好久,大概的只提到两点,一是内容长度大于字段长度,这是不可能的,是读数据。另外就是内容中有特殊字符。难道是 \0 ?在数据库中查询,也不太对,为此我还特意替换掉了内容中的换行等字符。但是发现出现的条目和实际出错的条目不一致,而且只导入前一部分数据,错误一直是那些记录。忽然想到中间数据导入有一个转编码的过程,能不能直接连MSSQL使用UTF-8编码呢?查了下MS手册,原来是支持的,连接参数中加入CharacterSet=>'utf-8'就可以用UTF-8连接服务器了。于是把文件备份了下,去除转编码操作。重新测试,问题解决。

其实MSSQL中的字段编码问题以前也遇到过,就是设置的text或char,varchar等字段不支持特殊字符,插入数据时会出错,用n起头的类型就没问题,看来为了以后兼容,可能用到中文的字段都要用n类型的字段才好。