问题
使用pdo_odbc连接sqlserver发现对中文支持,不是太好。尤其是SQL server默认的字符集是GBK。
为了解决插入中文乱码,读取也会乱码的问题,变更连接方式。
测试是用freetds pdo_dblib组合
- freetds已经包含在epel里,所以只要有epel的repo即可通过yum来安装。安装前提是,要首先安装了unixODBC包。
yum install freetds freetds-devel -y
- 对pho_dblib编译
编译过程中,可能会出现找不到 /usr/lib/libsydbd.so|a 的提示。
其实so已经有了,不过已经不在/usr/lib里,而是安装到了/usr/lib64里边。所以可以做一个软链解决。
sudo ln -s /usr/lib64/libsybdb.so /usr/lib/libsybdb.so
进入源码包目录的ext中,到pdo_dblib目录
cd php-5.6.17/ext/pdo_dblib/
/usr/local/bin/phpize
./configure --with-pdo-dblib=/usr --with-php-config=/usr/local/bin/php-config
make
sudo make install
编译完成后,就会在扩展目录生成文件 pdo_dblib.so
*让php增加扩展
vim php.ini
##add pdo_dblib.so
extension="pdo_dblib.so"
php代码样例
<?php
try {
$hostname = "testserver.sqlserver.com";
$port = 1433;
$dbname = "dbname";
$username = "user";
$pw = "pwd";
$dbh = new PDO ("dblib:host=$hostname:$port;charset=UTF-8;dbname=$dbname","$username","$pw");
} catch (PDOException $e) {
echo "Failed to get DB handle: " . $e->getMessage() . "\n";
exit;
}
$stmt = $dbh->prepare("select name from master..sysdatabases where name = db_name()");
$stmt->execute();
while ($row = $stmt->fetch()) {
print_r($row);
}
unset($dbh); unset($stmt);
?>