【问题标题】:PHP/PDO and SQL Server connection and i18n issuesPHP/PDO 和 SQL Server 连接和 i18n 问题
【发布时间】:2010-09-15 18:21:51
【问题描述】:

在我们的网络应用程序中,我们使用 PHP5.2.6 + PDO 连接到 SQL Server 2005 数据库并存储俄语文本。

数据库排序规则为Cyrillic_General_CI_AS,表排序规则为Cyrillic_General_CI_AS,列类型为NVARCHAR(MAX)

我们尝试使用以下两种方案连接到数据库,但都会导致不同的问题。

  1. PDO mssql:

    $dbh = new PDO ('mssql:host='.$mssql_server.';dbname='.$mssql_db, $mssql_login, $mssql_pwd);
    

    在这种情况下是这样一个简单查询的结果:

    SELECT field1 FROM tbl1 WHERE id=1
    

    显示field1 数据被截断为 255 个字节。

  2. PDO odbc:

    $dbh = new PDO ('odbc:DSN=myDSN;UID='.$mssql_login.';PWD='.$mssql_pwd);
    

    在这种情况下,同一查询的结果显示完整的未截断数据,但带有问号而不是俄语符号。


注意事项:

  • 在 SQL Management Studio 中,数据不会被截断,俄语符号也能正确显示。
  • 我们有 Windows 2003 Enterprise Edition SP2

那么我们应该选择什么样的连接方式以及如何解决相应的问题呢?

【问题讨论】:

    标签: php sql-server sql-server-2005


    【解决方案1】:

    连接后尝试执行SET NAMES "charset"

    我不知道匹配 Cyrillic_General_CI_AS 的字符集是什么,但试试“西里尔字母”?

    【讨论】:

      【解决方案2】:

      我必须这样做才能从 MSSQL 中的 NVARCHAR 字段中获取可用数据:

      $_ = iconv('Windows-1252', 'UTF-8', $_);
      

      【讨论】:

        【解决方案3】:

        我一直很幸运地使用 utf8_general_ci 全面 - 用于连接、排序 - 一切。

        但是,我只对 MySQL 和 PostgreSql 有过这种经验,而对 SQL Server 没有。

        至于您的 DSN 问题 - 我不确定。

        祝你好运!

        【讨论】:

        • 感谢您的回复,但问题出在 PHP/PDO 中 - 因为当我们在 .NET 中连接到同一个数据库时,一切正常。
        【解决方案4】:

        如果您未设置 PDO,请使用 FreeTDS - 也称为程序 mssql_* 调用。在 PDO 修复之前,这是推荐的解决方法之一。自 PHP 5.1.2 起,FreeTDS 有一个mssql.charset-option

        【讨论】:

          【解决方案5】:

          我也注意到了同样的问题,使用 PDO 实现 SQL server 2005 和 PHP 5.x。当我将 nvarchar(MAX) 字段更改为 nvarchar(255) 时,奇怪的问号字符停止出现。我绝对相信它与 PDO 和 MS SQL 服务器中的 ODBC 驱动程序有关。当您在 varchar 中隐式指定最大字符时,它可以解决问题。

          【讨论】:

            猜你喜欢
            • 2011-09-21
            • 1970-01-01
            • 2012-10-22
            • 1970-01-01
            • 2020-02-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-24
            相关资源
            最近更新 更多