Solution
Use ODBC
代替dblib
,它提供了 PDO 的全部功能。
请注意,ODBC 有两种可能的配置:独立的ODBC https://web.archive.org/web/20200504140812/http://www.freetds.org:80/userguide/odbcinionly.htm and 带有 ODBC 驱动程序的 FreeTDS https://web.archive.org/web/20200504140959/http://www.freetds.org:80/userguide/odbcombo.htm。根据我的经验,要设置连接的字符集,必须使用 ODBC 驱动程序通过 FreeTDS 来完成,这使得组合配置更可取。
ODBC 设置
我在网上搜索了许多不同的 StackOverflow 帖子和各种文档源,了解如何正确安装 ODBC。我从以下三个参考文献的混合中提取了我的解决方案:
- unixODBC 设置文档 http://www.unixodbc.org/doc/FreeTDS.html
-
FlipperPA
的回答设置 FreeTDS https://stackoverflow.com/questions/33341510/how-to-install-freetds-in-linux(顺便用ODBC完成)
-
Benny Hill
对此的回答FreeTDS 的设置问题 https://stackoverflow.com/questions/13066716/freetds-not-using-its-config
以下是我用来配置的步骤列表ODBC
using FreeTDS
在基于 Debian 的系统上。
TDS 8.0 支持准备好的语句。
注意:不支持SET NAMES a
or SET CHARSET a
在连接上;需要通过设置 FreeTDS 属性使用组合配置来定义字符集。使用独立 ODBC 驱动程序默认字符集为ASCII
,这给出了奇怪的结果。看我的其他帖子 https://stackoverflow.com/questions/279170/utf-8-all-the-way-through获取可能问题的示例。
安装需要的包:
sudo apt-get install freetds-bin freetds-common unixodbc tdsodbc
php5-odbc
-
freetds-bin
提供 FreeTDS,以及tsql
and isql
(用于后续调试)。
-
freetds-common
系统上已安装,但不包括这两个调试工具。安装中freetds-bin
在定义配置后的晚些时候,不会出现任何问题。
-
unixodbc
是 ODBC 驱动程序
-
tdsodbc
为 ODBC 提供 TDS 协议
-
php5-odbc
是使用 ODBC 驱动程序的 php 模块。请注意,您的 php 版本可能与我的不同。
配置独立 unixODBC
ODBC 驱动程序设置/etc/odbcinst.ini
:
[odbc]
Description = ODBC driver
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
UsageCount = 1
在中创建系统范围的数据源名称配置/etc/odbc.ini
:
[datasourcename]
Driver = odbc
Description = Standalone ODBC
Server = <IP or hostname>
Port = <port>
TDS_Version = 8.0
配置 unixODBC 和 FreeTDS:
ODBC 驱动程序设置/etc/odbcinst.ini
:
[odbc]
Description = ODBC driver
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
UsageCount = 1
在中创建系统范围的数据源名称配置/etc/odbc.ini
:
[datasourcename]
Driver = FreeTDS_odbc
Description = Uses FreeTDS configuration settings defined in /etc/freetds/freetds.conf
Servername = datasourcename
TDS_Version = 8.0
将 ODBC 数据源名称配置添加到 FreeTDS 中/etc/freetds/freetds.conf
:
[datasourcename]
host = <IP or hostname>
port = <port>
client charset = UTF-8
tds version = 8.0
text size = 20971520
encryption = required
重要提示:确保进程可以读取 odbc 文件
那将是阅读它们。如果您正在使用以下方式运行网络服务器www-data
用户,他们必须具有适当的权限才能读取这些内容
文件!
您现在可以在中设置连接字符集freetds.conf
并使用 PDO 连接到数据库
$pdo = new PDO('odbc:datasourcename');
Testing:
Use tsql
检查 FreeTDS 是否已配置并且可以连接到数据库。
tsql -S 数据源名称 -U 用户名 -P 密码
Use isql
检查 ODBC 是否正确连接。
isql -v 数据源名称 用户名 密码
将 ODBC 与 PHP 链接:
添加 ODBC PHP 模块php.ini
通过添加以下内容:
扩展名=odbc.so
请注意,您的php.ini
位置取决于您使用的网络服务器。
使用<?php phpinfo(); ?>
并通过网络服务器查看它以找到其位置。
重新启动阿帕奇
编辑:
添加了有关驱动程序字符集功能的信息,因为我遇到了独立 ODBC 配置的问题,它将忽略任何更改连接字符集的尝试。