【问题标题】:Encoding PHP PDO MS SQL Server编码 PHP PDO MS SQL Server
【发布时间】:2013-10-14 07:21:20
【问题描述】:

我开始使用 MS SQL Server 学习 PDO。 使用此代码连接:

$userDB = 'userBD';
$passwordDB = 'passwordDB';

try {
  $DBH = new PDO('mssql:dbname=spr_bank;host=hostname', $userDB, $passwordDB);
  $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

}
catch(PDOException $e) {
    echo "<h1 style='font-weight:bold; color:red;'>Error. Can not connect to Database</h1>";
    file_put_contents('PDOErrors.log', date("Y-m-d H:i:s")." - ".$e->getMessage()."\n", FILE_APPEND);
    exit();
}

现在,我从表中选择数据:

      //simple query and binding with results
      $query = $DBH->prepare("SELECT name FROM spr_sotrudnik WHERE login = :login AND password = :password");

      $login = (isset($_POST['login']) === true) ? $_POST['login'] : '' ; // ? : shorthand for if else
      $password = (isset($_POST['password']) === true) ? md5($_POST['password']) : '' ; // ? : shorthand for if else

      // bind parameters - avoids SQL injection
      $query->bindValue(':login', $login);
      $query->bindValue(':password', $password);

      //try... if not catch exception
      try {
          // run the query
          $query->execute();

          while($rows = $query->fetch()){
            echo $rows["name"];
          }
      }
      catch(PDOException $e){
          echo $e->getMessage(), $e->getFile(), $e->getLine();
      }

当我转到浏览器时,我收到此错误:

SQLSTATE[HY000]:一般错误:10007 Unicode 唯一排序规则中的 Unicode 数据或 ntext 数据无法发送到使用 DB-Library(如 ISQL)或 ODBC 版本 3.7 或更早版本的客户端。 [10007](严重性 5)[(null)]D:\www\sklad_new\inc\auth.php19

当我写这个查询时 $query = $DBH-&gt;prepare(" SELECT CONVERT(VARCHAR(MAX),name) AS s FROM spr_sotrudnik WHERE login = :login AND password = :password");

我没有错误,但我看到“?????

我该如何更改?

【问题讨论】:

  • 你在用什么driver? PDO_DBLIB、PDO_ODBC 还是 PDO_SQLSRV?
  • 我认为这是 driver ,但我不确定。如何查看?
  • 对不起,我真的不需要问,因为你已经显示了 DNS:mssql:...。您正在使用PDO_DBLIB
  • 糟糕...我的意思是 DSN,不是 DNS...
  • VARCHAR 不是 unicode,它是 ASCII。我敢打赌name 是一个 NVARCHAR 字段,您正在使用与存储数据不兼容的代码页将其强制转换为 ASCII。默认代码页与数据库的排序规则相匹配。您可以使用 COLLATE 子句使用特定的排序规则,但真正的解决方案是使用支持 Unicode 的驱动程序

标签: php sql-server encoding pdo


【解决方案1】:

您在DSN string 中省略了charset 参数:

$DBH = new PDO('mssql:dbname=spr_bank;host=hostname', $userDB, $passwordDB);

...所以您可能在整个工具链中使用默认编码。

无论如何,PDO_DBLIB 驱动程序显然是 tagged as experimental 并包含此通知:

在 Windows 上,您应该使用 SqlSrv,MS SQL 的替代驱动程序是 可从 Microsoft 获得:» http://msdn.microsoft.com/en-us/sqlserver/ff657782.aspx.

如果不能使用SqlSrv,可以使用PDO_ODBC驱动 连接到 Microsoft SQL Server 和 Sybase 数据库,作为 本机 Windows DB-LIB 是古老的,线程不安全的,不再支持 微软

根据我的经验,这意味着您可以获得各种无法预料的副作用。

【讨论】:

  • @Mr.AbduJan - PHP 手册的建议。我已经编辑了答案以包含完整的引用。但我建议您找出您的应用程序和数据库使用的编码;无论司机是谁,您都需要这些信息。
猜你喜欢
  • 2016-02-04
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 2013-09-27
  • 2014-02-04
  • 2012-09-17
  • 1970-01-01
相关资源
最近更新 更多