Windows和Linux下连接Sybase数据库的一点小区别
授权方式:署名,非商业用途,保持一致,转载时请务必以超链接(http://www.fwolf.com/blog/post/188)的形式标明文章原始出处和作者信息及本声明。首先说明一下我的应用环境,免得误会:
服务器:win2000、sybase 11.92(cp936字符集)、apache2、php5。
开发环境:ubuntu linux、apache2、php5,数据库直接连接服务器。
以前使用winxp的时候,在php中连接sybase数据库非常方便,再加上使用adodb类库,就更爽了,唯一的一点麻烦就是由于cp936不是sybase 11.92标准的字符集,是硬从sybase 12里面套过来的,所以在连接数据库,执行connect方法的时候也许会有一个warning警告,不过不影响使用,在connect前面加上@屏蔽掉即可(注意,这也是我在遇到本文所述问题时,花了很大时间都找不到问题的直接原因,罪过啊)。
但是,在系统切换到ubuntu下之后,突然发现一个连接sybase数据库的php程序不能用了,错误信息为:
‘ in /media/hdd5/php_includes/adodb/adodb-exceptions.inc.php:76
Stack trace:
#0 /media/hdd5/php_includes/adodb/adodb.inc.php(879): adodb_throw(’sybase’, ‘EXECUTE’, 0, ”, ’select count(1)…’, false, Object(ADODB_sybase))
#1 /media/hdd5/php_includes/adodb/adodb.inc.php(854): ADOConnection->_Execute(’select count(1)…’, false)
#2 /media/hdd6/websoft/fwolfweb/tools/work_stat/work_stat.php(396): ADOConnection->Execute(’select count(1)…’)
#3 /media/hdd6/websoft/fwolfweb/tools/work_stat/work_stat.php(659): WorkStat->Rsql(’select count(1)…’, ‘jygl’)
#4 /media/hdd6/websoft/fwolfweb/tools/work_stat/work_stat.php(241): WorkStat->StatXysc()
#5 /media/hdd6/websoft/fwolfweb/tools/work_stat/index.php(32): WorkStat->GenerateCache()
#6 {main}
thrown in /media/hdd5/php_includes/adodb/adodb-exceptions.inc.php on line 76
注意其中有一处为乱码“�°�%”,于是怀疑是编码的问题。这个程序中涉及到编码和字符集的地方,是由于php源码使用的都是utf8编码,而sybase使用cp936编码,所以执行sql的时候要转换为gbk,执行结果要显示的时候又要转换为utf8编码。但是反复检查、增删编码处理部分,除了错误信息由乱码变为正常汉字之外,没有任何进展。
没办法,重新写一段最简单的数据库连接程序测试一下:
require_once('adodb/adodb.inc.php');
$db = &ADONewConnection('sybase');
$db->Connect(’server3′, ’sa’, ”, ‘dbname’);
$rs = $db->Execute(’select 1′);
?>
运行错误如下:
这才恍然大悟,原来根本就没有连接上数据库,自然在执行sql的时候出错。要问刚才为什么没有发现,我不是加上@屏蔽了错误信息嘛。继续分析,上面这段代码原来在winxp客户端调试的时候是绝对能够连上服务器的,怎么在linux下就不行呢,又将服务器名更换为ip地址:端口,就成功了。
可能是由于linux下没有netbios(正如linux无法使用“ping 机器名”命令一样),还可能是linux下没有安装sybase open client,设置dsedit,总之,在linux下连接sybase服务器,只能使用“机器名:端口号”作为hostname,无法直接使用主机名。
于是,在程序中增加一部分字段判断主机操作系统,对hostname进行赋值的语句,问题顺利解决:
$host_srv = ‘192.168.0.1:5000′;
else
$host_srv = ’server3′;
$server[0]['dbtype'] = ’sybase’;
$server[0]['host'] = $host_srv;
……
![[Bloglines]](http://www.fwolf.com/blog/wp-content/plugins/bookmarkify/bloglines.png)
![[co.mments]](http://www.fwolf.com/blog/wp-content/plugins/bookmarkify/comments.png)
![[del.icio.us]](http://www.fwolf.com/blog/wp-content/plugins/bookmarkify/delicious.png)
![[Digg]](http://www.fwolf.com/blog/wp-content/plugins/bookmarkify/digg.png)
![[diigo]](http://www.fwolf.com/blog/wp-content/plugins/bookmarkify/diigo.png)
![[Facebook]](http://www.fwolf.com/blog/wp-content/plugins/bookmarkify/facebook.png)
![[Furl]](http://www.fwolf.com/blog/wp-content/plugins/bookmarkify/furl.png)
![[Google]](http://www.fwolf.com/blog/wp-content/plugins/bookmarkify/google.png)
![[MySpace]](http://www.fwolf.com/blog/wp-content/plugins/bookmarkify/myspace.png)
![[Reddit]](http://www.fwolf.com/blog/wp-content/plugins/bookmarkify/reddit.png)
![[Rojo]](http://www.fwolf.com/blog/wp-content/plugins/bookmarkify/rojo.png)
![[Slashdot]](http://www.fwolf.com/blog/wp-content/plugins/bookmarkify/slashdot.png)
![[StumbleUpon]](http://www.fwolf.com/blog/wp-content/plugins/bookmarkify/stumbleupon.png)
![[Technorati]](http://www.fwolf.com/blog/wp-content/plugins/bookmarkify/technorati.png)
![[Windows Live]](http://www.fwolf.com/blog/wp-content/plugins/bookmarkify/windowslive.png)
![[Yahoo!]](http://www.fwolf.com/blog/wp-content/plugins/bookmarkify/yahoo.png)
![[Email]](http://www.fwolf.com/blog/wp-content/plugins/bookmarkify/email.png)