FPM 中 PDO 与使用 UTF8 的 CLI 的不同结果

时间:2021-06-02 18:49:27

标签: php pdo

简短版本是 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 的简化代码

0 个答案:

没有答案