使用带有dblib驱动程序的PDO从Microsoft Azure Transact SQL获取数据时,问号而不是俄语字符

时间:2016-12-27 11:48:31

标签: php sql-server azure pdo

我正在尝试从PHP连接Microsoft Azure SQL Server。 目前在Ubuntu 14.04上的PHP 5.5.9

在将服务器升级到16.04和PHP 7之前,一切正常。 由于具有'N'字符的unicode字符串之前的更新停止工作。当我从准备好的语句中删除'N'时它开始正常运行而不是一件事:当我插入或更新俄语符号时,它们被存储为chineese。

明天我尝试了很多不同的事情试图解决这个问题。最后我决定回滚到Ubuntu 14.04。 但令我惊讶的是,我得到了同样的效果。

这是我的连接字符串:

$connection = new PDO ("dblib:version=7.0;charset=UTF-8;host=".AZURE_SQL_HOST.":".AZURE_SQL_PORT.";dbname=".AZURE_SQL_DB, AZURE_SQL_USER, AZURE_SQL_PASS);

我不知道应该提供什么信息。有人可以指导我吗?

提前致谢!

更新 我不知道究竟发生了什么,但不知怎的,我开​​始收到问号。看起来像chineese char问题只有php7。

现在我无法摆脱这个问号。

1 个答案:

答案 0 :(得分:1)

最后整理出所有内容:

  1. Chineese符号仅在PHP7中发生。在php7中,我无法以任何方式使用'N'字符制作PDO准备语句。
  2. 当我在php7周围跳舞时,我切换到命名集传递变量样式。这就是问题的根源。似乎命名(:name)参数不能与'N'一起使用,问号(?)参数也可以。
  3. 没关系:

    $statement = $pdo->prepare("SELECT * FROM some_table WHERE some_field=?");
    $statement->execute(['SOME_UNICODE_CHARS']);
    

    这不是:

    $statement = $pdo->prepare("SELECT * FROM some_table WHERE some_field=:field");
    $statement->execute([':field' => 'SOME_UNICODE_CHARS']);
    

    希望这可以节省一些时间......