PDOException: SQLSTATE[IMSSP]:在 Azure 和 SQL Azure 后端使用 drupa


PDOException: SQLSTATE[IMSSP]: error occurred translating string to UCS-2, using drupal 7 at azure and sql azure backend

我最近开始使用Web角色和SQL Azure后端在Azure云上建立一个drupal 7网站。我非常高兴,直到我碰到了一个角色设置的砖墙。

我有一个虚拟机,将Windows Server 2008

R2,IIS 7.5,SQL Server 2008 R2作为开发服务器,在将更改上传到云之前尝试更改。我在drupal数据库中有一些额外的表来支持我的应用程序自定义模块。除此之外,在某些时候我需要运行一些这样的代码:

$r = db_select('my_creators', 'c')
    ->fields('c')
    ->condition('my_url', $creator_url)
    ->execute()
    ->fetchAll(PDO::FETCH_ASSOC);
$creator = $r[0];
foreach ($creator as $k => $vv)
    $s.= t('@key -->> @value<br>', array('@key' => $k, '@value' => $v));
print $s;

我已经删除了很多额外的代码,但是当$creator_url具有具有某些特殊字符的值(例如André_Breton)时,这是有问题的代码。这在我的开发机器上完美运行,获取记录并显示数据,因此当我上传到云并收到此错误时,我感到非常惊讶

PDOException: SQLSTATE[IMSSP]:将输入参数 7 的字符串转换为 UCS-2 时出错:目标多字节代码页中不存在 Unicode 字符的映射。 in dblog_watchdog() (第 157 行 ofE:''sitesroot''0''modules''dblog''dblog.module)。

底层数据库是相同的,实际上我每天都会将 sql azure 数据库数据同步到开发 sql 服务器数据库。所有字符数据字段都是 nvarchar。

我交叉检查了IIS,php,php扩展,php的所有版本.ini并且都是相同的。

我设法通过添加来解决这个问题

Database::getConnection()->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_SYSTEM);
$creator_url = iconv('UTF-8', 'UCS-2', $creator_url);

在选择之前,然后进行打印

foreach ($creator as $k => $vv) {
    $v=iconv('ISO8859-1', 'UTF-8', $vv);
    $s.= t('@key -->> @value<br>', array('@key' => $k, '@value' => $v));
}

使用此解决方法,选择通过,选择并显示正确的记录,但随后我收到几个警告

警告:htmlspecialchars():check_plain() 中参数中的多字节序列无效(第 1572 行 ofE:''sitesroot''0''include''bootstrap.inc)。警告:htmlspecialchars():check_plain() 中参数中的多字节序列无效(第 1572 行 ofE:''sitesroot''0''include''bootstrap.inc)。

这是有道理的,因为通常drupal函数期望所有字符串都是UTF-8。

我已经把头撞在墙上几天了,任何帮助将不胜感激。

谢谢!

我不熟悉Drupal或PHP。但根据 http://blogs.msdn.com/b/qingsongyao/archive/2009/04/10/sql-server-and-utf-8-encoding-1-true-or-false.aspx 的说法,SQL Server(以及类似的SQL Azure)并不支持UTF-8。它支持 UTF-16。在大多数情况下,SQL Server将自动转换编码。但是,如果字符存在于 UTF-8 中,但不是 UTF-16,则可能会遇到此问题。在这种情况下,请尝试转义此字符。例如,您可以定义一个规则,以便"/myspecialcharacter"对应于 UTF-16 中不存在的特殊字符。我想建议你在PHP端逃脱/取消逃脱。

此致敬意

徐明.