使用 PDO ODBC SQL Server 连接时定义编码?

Posted

技术标签:

【中文标题】使用 PDO ODBC SQL Server 连接时定义编码?【英文标题】:Define encoding when using PDO ODBC SQL Server connection? 【发布时间】:2021-06-25 08:11:25 【问题描述】:

我使用如下方式连接到 SQL Server:

$pdo = new PDO("odbc:DRIVER=ODBC Driver 17 for SQL Server;SERVER=$serverName;DATABASE=$dbName", $username, $password);

PDO 实例已创建,我可以使用它运行 SQL 查询,但有时会出现与字符集相关的错误。

数据库排序规则是非 unicode (latin2),我希望得到 UTF8 格式的响应。怎么可能定义呢?

我能够找到一些参数,例如 PDO::mysql_ATTR_INIT_COMMAND => "SET NAMES ...",但这里没有这些参数,因为我有一个 SQL Server。

【问题讨论】:

你可以使用支持全Unicode的nvarchar 我无法更改列定义 那你期待什么?这些不是 php 错误,SQL Server 告诉您它根本无法使用该排序规则将该数据存储在 varchar 列中,这是不可能的。字符集错误到底是什么,它是如何发生的(是什么代码导致的)? @Charlieface 我们之前使用过旧的mssql_ 函数,并且一切正常。表格是使用mssq_ 从 php 填充的。现在我们升级到 PHP 7,我们唯一的选择是带有 ODBC SQL Server 驱动程序的 PDO。如果我在 SQL Server Management Studio 中列出该表的内容,我可以看到所有行而不会出现错误。所以这个错误一定是新驱动的,但我不知道如何配置它。 【参考方案1】:

您必须尝试如下添加 Client_CSet=UTF-8;到您的连接代码。

$pdo = new PDO("odbc:DRIVER=ODBC Driver 17 for SQL Server;SERVER=$serverName;DATABASE=$dbName;Client_CSet=UTF-8;Server_CSet=Windows-1251", $username, $password);

【讨论】:

【参考方案2】:

只需要在dns 变量中添加charset=utf8。 你可以试试这个配置:

$dns = "odbc:DRIVER=ODBC Driver 17 for SQL Server;SERVER=$serverName;DATABASE=$dbName;charset=utf8"

$pdo = new PDO($dns, $username, $password);

Similar question。希望能帮到你。

【讨论】:

以上是关于使用 PDO ODBC SQL Server 连接时定义编码?的主要内容,如果未能解决你的问题,请参考以下文章

PHP PDO ODBC 连接

使用 SQL Server Driver 通过 PDO 连接到 SQL Server

如何在LINUX下用PDO连接SQLSRVER 2008

PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】

SQL Server ODBC 连接失败

如何用odbc连接sqlserver