Linux 通过 ODBC 连接 SQL Server2008

时间:2021-07-11 04:46:52

在windows环境下,连接SQL Server还是比较容易实现的,可以通过微软上面下载扩展驱动sqlsrv,或者通过odbc方式,例如下载最新版的xampp就能够直接打开extension=php_pdo_odbc.dll 就能够使用odbc方式连接,还有mssql也可以,freetds也提供了windows版本的扩展。

但在linux下就比较麻烦一点,毕竟微软的东西原本就不想跟linux有太多的关联,不过我们在开发项目的过程当也难免会遇到使用linux服务器,但需要连接的却是另一台windows服务器下面的SQL Server的情形,这两天刚好研究整理了一下,记录了配置及安装的过程。

首先我们需要的是配置SQL Server2008可以远程访问,这个步骤我就不详述了,可以百度查找相关教程,或者通过链接:http://jingyan.baidu.com/article/fec4bce226a264f2618d8ba5.html  按照上面的操作一下。


接下来就是要安装相差的驱动了,在linux系统下,我们需要:

linux系统下的unixODBC ( http://www.unixodbc.org );

连接SQL Server的驱动 Freetds ( http://www.freetds.org );


安装unixODBC

# tar -zxvf unixODBC-2.3.4.tar.gz

# cd unixODBC-2.3.4

# ./configure  --prefix=/usr/local/unixODBC  --includedir=/usr/include  --libdir=/usr/lib -bindir=/usr/bin --sysconfdir=/etc

# make && make install


安装完成后找到php.ini文件加入:

[PDO_ODBC]
extension=pdo_odbc.so

重启php;


安装Freetds

# tar -zxvf freetds-patched.tar.gz

# cd freetds-1.00.40

# ./configure --prefix=/usr/local/freetds --with-unixodbc=/usr/local/unixODBC --with-tdsver=7.3

# make && make install


如果在安装unixODBC过程中报 unknown type name 'function_entry' ,则有可能是php版本不一样导致的,只需要找到报错对应的那个xxx.c文件,vim编辑,找到function_entry改成 zend_function_entry保存退出重新编译即可。

如果在安装freetds过程中报 sql.h not found 的错误,则是找不到unixODBC的安装路径导致的,上面的编辑已经指定地址,若指定仍报错,可能是安装的路径不是上面那个,此时可以利用find / -name 'unixODBC*' 查找下具体的安装路径文件夹在哪里。

还有一点需要注意的是,上面的freetds安装配置的时候,--with-tdsver=7.3这个是指定版本的,7.3正好配对SQL Server2008,具体的对应安装版本可以查看freetds的相关文档,地址:http://www.freetds.org/userguide/choosingtdsprotocol.htm#AEN910 

可以在安装完成freetds之后查看相关版本号:

Linux 通过 ODBC 连接 SQL Server2008


以上的安装完成之后,还需要修改odbc的配置文件,以支持odbc的操作。

# vim /etc/odbcinst.ini


在odbcinst.ini里面加入:

[SQL Server]
Description     = ODBC for SQL Server
Driver               = /usr/local/freetds/lib/libtdsodbc.so
Setup               = /usr/local/freetds/lib/libtds.so
FileUsage       = 1

Linux 通过 ODBC 连接 SQL Server2008


到此,环境基本配置完成,接下来就可以利用odbc的方式连接SQL Server数据库了,下面是php的测试连接代码:

try{
$cnx = new PDO("odbc:Driver={SQL Server};Server=1.1.1.1,1433;Database=database;",'username','password');
}catch (PDOException $e){
echo $e->getMessage();
}

var_dump($cnx);
$a = $cnx->query("SELECT * FROM [user]");
var_dump($a);
foreach ($a as $b) {
var_dump($b);
}
exit;