【问题标题】:Define encoding when using PDO ODBC SQL Server connection?使用 PDO ODBC SQL Server 连接时定义编码?
【发布时间】: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 中列出该表的内容,我可以看到所有行而不会出现错误。所以这个错误一定是新驱动的,但我不知道如何配置它。

标签: php sql-server pdo odbc


【解决方案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。希望能帮到你。

    【讨论】:

      猜你喜欢
      • 2014-02-04
      • 2011-07-17
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      相关资源
      最近更新 更多