简短版本是 PDO_DBLIB 在通过 PHP_FPM 与 CLI 执行时返回不同的结果。结果包含\xC2\xA0(UTF-8 NBSP),在CLI运行时有反映,在FPM中不反映。
我编写的一个非常简单的测试来隔离这个问题:
<?php
require('include/config.php');
$handle = new PDO ("dblib:host={$cfg['cwdb']['address']};dbname={$cfg['cwdb']['database']}", $cfg['cwdb']['username'], $cfg['cwdb']['password']);
$result=$handle->query("select SR_Detail_Notes from sr_detail where sr_service_recid=1402978 and sr_detail_notes like '%Computer:%'");
$row = $result->fetch(PDO::FETCH_ASSOC);
echo "<pre>Running as " . PHP_SAPI . "\n\n";
echo "Line: {$row['SR_Detail_Notes']}\n";
echo "Hex: " . bin2hex($row['SR_Detail_Notes']) . "\n";
CLI 输出:
Running as cli Line: Computer: bw(redacted) Hex: 436f6d70757465723ac2a06277(redacted)
FPM 输出:
Running as fpm-fcgi Line: Computer:�bw(redacted) Hex: 436f6d70757465723aa06277(redacted)
如您所见,当通过 FPM 运行时,它会剥离 \xC2 并留下 \xA0。环境为 PHP 7.3.28 和 nginx/php-fpm。通过 phpinfo() 确认在 CLI 与 FPM 中加载了相同的 ini 文件。
编辑:出于演示目的删除 PCRE 的简化代码