perl odbc mysql_perl通过unixODBC连接SQLServer

本文讲述三个内容: 一:说明 二:环境配置 三:操作脚本内容 一:说明 MS从来没有提供过SQLServer for Linux,所以大家也不要去尝试在Linux系统安装SQLServer,但是可以 通过 ODBC 连接 Windows系统的SQLServer数据库; WindowsServer 2003用户注意: 在Windows Se

本文讲述三个内容:

一:说明

二:环境配置

三:操作脚本内容

一:说明

MS从来没有提供过SQLServer for Linux,所以大家也不要去尝试在Linux系统安装SQLServer,但是可以通过ODBC连接Windows系统的SQLServer数据库;

WindowsServer 2003用户注意:

在Windows Server 2003系统上安装的SQLServer是不会打开1433端口的,所以请Windows2003用户在安装完SQLServer之后一定装上SQLServer SP3布丁

二:安装相关驱动及环境配置

如果没安装DBI最好先安装DBI 不然后面会报错

DBI安装:DBI详细信息参考:http://dbi.perl.org/

1.下载DBI包:

下载地址:http://search.cpan.org/CPAN/authors/id/T/TI/TIMB/DBI-1.620.tar.gz

tar xzf DBI-1.620.tar.gz

进入解压包内 perl Makefile.PL

make test

make

make install (如果不是root用户,要sudo一下)

1.下载相关软件 unixODBC、freetds和DBD-ODBC

首先需要下载3个文件:

Linux系统的ODBC

unixODBC-2.2.8.tar.gz ( http://www.unixodbc.org)

连接SQLServer或Sybase的驱动

freetds-0.62.4.tar.gz ( http://www.freetds.org)

perl的ODBC模块

DBD-ODBC-1.12.tar.gz ( http://cpan.perl.org)

把下载到的三个文件放到同一个目录

2.安装unixODBC

# tar vxzf unixODBC-2.2.8.tar.gz

# cd unixODBC-2.2.8

# ./configure --prefix=/usr/local/unixODBC --enable-gui=no

# make

# make install

3.安装freetds

# tar vxzf freetds-0.62.4.tar.gz

# cd freetds-0.62.4

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

# make

# make install

4.安装DBD-ODBC

在安装之前要先设置一下环境变量

# export ODBCHOME=/usr/local/unixODBC

之后开始编译安装

# tar vxzf DBD-ODBC-1.12.tar.gz

# cd DBD-ODBC-1.12

# perl Makefile.PL

# make

# make install所有的软件到现在都安装完成了,接下来就是配置了

5.配置freetds

# cd /usr/local/freetds

# vi etc/freetds.conf修改以下的一段,并把;去掉

改好之后的内容:

[MyServer2k] #不同驱动的此处名字不同 注意 下面测试时注意对应

host=192.168.0.32

port=1433

tds version=8.0

其中的[MyServer2k]代表在客户端使用的服务器名称,host代表SQLServer服务器的IP地址,port代表端口,测试连接;

其配置项解释如下:

tds version: 指明tds协议的版本,连接数据库时使用,如果在环境变量中没有设置

此项,则由此配置决定,协议版本可取4.2,5.0,7.0,8.0。

host: 数据库服务器的主机名或者ip地址。

port: 数据库服务器的监听端口,可以取任何有效的端口值,一般而言Sybase SQL10以前为1433,10以上用5000,而Sybase SQLAnywhere 7是2638,Microsoft SQL server则用1433。此配置可以被环境变量中的TDSPORT改写。

initial block size: 此值只能取512的倍数,默认为512,指定了协议块的最大值,

一般不要改变此默认 配置。

dump file: 任何有效的文件名,指明了转储文件的路径并且会打开日志记录。

dump file append: yes或者no,决定是否追加保存到dump file文件中。

timeout:设置处理的最大等待时间。

connect timeout: 设置连接的最大等待时间。

emulate little endian: yes或者no,是否强制大端机使用小端方式与MS Server通信。

client charset: 任何有效的iconv字符集。默认值为ISO-8859-1,使FreeTDS使用iconv在数据库服务器和用户程序之间转换。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

注意, client charset 必需大于或等于服务端数据库使用的字符集.

例如,服务端数据库是 MS SQL Server 2000, 字符集是 GB2312.

那么 client charset 可以设置为 GB2312(等于), GB18030(大于),UTF-8(大于)但不能设为ISO-8859-1(小于), Shift_JIS(不等于).

由于 UTF-8 是所由字符集的超集,因此设置为 UTF-8 总是可行的.

此外, FreeTDS的client charset不能设置为 UTF16. 这时目前该软件设计的局限,其官方网站称,在未来版本中可能会增加对client charset UTF16的支持.

# bin/tsql -S MyServer2k -H 192.168.0.32 -p 1433 -U sa -P password

1> use gameDB

2> go

1> select count(*) from t_ip

2> go

4

1> quit一切都很顺利

现 在来说明以下这些参数的作用,-S MyServer2k是在freetds.conf中定义好的,-H 192.168.0.32服务器IP地址,和freetds.conf中的一致,如果使用了-S参数,这个参数可以不用,-p 1433用来指定端口是1433 ,-U sa用来指定连接数据库的用户名,-P password用来指定连接数据库的密码。

6.配置unixODBC

# cd /usr/local/unixODBC

向ODBC添加SQLServer驱动

# vi etc/odbcinst.ini

写入如下内容:

[TDS] ;驱动名称

Description = MS-SQLServer ;描述

Driver = /usr/local/freetds/lib/libtdsodbc.so ;驱动程序

Setup = /usr/local/freetds/lib/libtds.so ;不要问我,我也不知道这是什么

FileUsage = 1

或者

[FreeTDS]

Driver = /usr/local/freetds/lib/libtdsodbc.so

;Threading = 1

保存退出

添加DSN

# cd /usr/local/unixODBC

# vi etc/odbc.ini

写入如下内容

[123] ;DSN名称

Driver =TDS ;ODBC驱动 与上面odbcinst.ini中的驱动名称对应

Server = 192.168.0.32 ;sqlserver服务器IP 或者 Servername = MyServer2k ;在 freetds.conf中定义

Database = gameDB ;要使用的数据库

Port = 1433 ;端口

Socket =

Option =

Stmt =

或者

[zzq_cq]

Driver = FreeTDS

Server = 192.168.0.89

Port = 1433

TDS_Version = 7.2

Database=db

User=sa

Password=123

client charset=utf-8

保存并退出,测试ODBC的连接

# bin/isql -v 123 sa passwordSQL> select count(*) from t_ip

+----------+

| |

+----------+

| 4 |

+----------+

SQL> quit

OK,测试通过,开始测试perl能否正确使用ODBC

在使用perl连接ODBC之前要做些准备工作

把ODBC的共享库都复制到/usr/lib目录

# cp /usr/local/unixODBC/lib/libodbc.* /usr/lib

操作脚本时 如果报错:

install_driver(ODBC) failed: Can't load '/usr/local/lib64/perl5/auto/DBD/ODBC/ODBC.so' for module DBD::ODBC: libodbc.so.2: cannot open shared object file: No such file or directory at /usr/lib64/perl5/DynaLoader.pm line 200.

at (eval 5) line 3

Compilation failed in require at (eval 5) line 3.

Perhaps a required shared library or dll isn't installed where expected

at createalltable.pl line 27

则运行如下:

# find / -name "libodbc.so"

/usr/local/unixODBC/lib/libodbc.so

# echo "/usr/local/unixODBC/lib/" >> /etc/ld.so.conf

# ldconfig

三:操作脚本内容

# vi test.pl

内容如下

#!/usr/bin/perl

use DBI;

$dbh=DBI->connect('dbi:ODBC:123','sa','password');//这里的123于上面odbc.ini中定义的DSN名称对应

my $sth=$dbh->prepare("select * from t_ip"); //要执行的sql语句

$sth->execute();

while (@data=$sth->fetchrow_array()){ //把得到的内容放到data列表中

print "$data[0] $data[1] $data[2]\n";

}

资源释放语句,关闭语句(与mysql有点区别mysql可以直接disconnect):

$sth->finish;

$dbh->disconnect;

只单独disconnect会报错:

DBI::db=HASH(0x812938)->disconnect invalidates 1 active statement handle

(either destroy statement handles or call finish on them before disconnecting)

注意是 $sh对应位置的 变量 finish 而不是 $dbh

否则会报错:

Can't locate object method "finish" via package "DBI::db"

保存退出

# perl test.pl

PS: 如果 你拿到一台机子 不知道 它的驱动 可以进入/usr/local/unixODBC/etc中查看配置文件 odbcinst.ini 和odbc.ini

参考资料:

http://space.itpub.net/82392/viewspace-238018

http://opsyun.blog.51cto.com/1037036/713910

PS:!!!!!注意 在linux中用perl提取sqlserver的数据时,linux系统的编码要跟sqlserver数据库的编码相同 不然 提取出的数据会是乱码。 比如 sqlserver中的数据是gbk 则运行perl的linux系统也必须设为 gbk的环境 用 export LANG=zh_CN.GBK 详见:mysql乱码问题完美解决篇(我用的perl其他语言类推可解)

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值