使用 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 连接时定义编码?的主要内容,如果未能解决你的问题,请参考以下文章
使用 SQL Server Driver 通过 PDO 连接到 SQL Server