$dbh = new \PDO("dblib:host=xxx;dbname=test;charset=utf8","test","test");
$str1 = '中文测试';
// Snippet 1: With parameter binding
$sql = "INSERT INTO TEST (text) VALUES (:text)";
$stmt = $dbh->prepare($sql);
$stmt->bindValue(':text',$str1); // or $stmt->bindParam(':text',$str1,PDO::PARAM_STR);
$stmt->execute();
// Snippet 2: Text in SQL
$sql = "INSERT INTO TEST (text) VALUES ('".$str1."')";
$dbh->exec($sql);
在PHP 7中,
For Snippet 1 - 数据库中的字符最终被破坏(Mojibake)。
For Snippet 2 - 一切正常。
在PHP 5.5中,两个片段都按预期工作。
当我们将PHP 5.5升级到PHP 7时,我们发现了这一点。
所以问题是为什么Snippet 1在PHP 7设置中不起作用?
Ubuntu: Linux 3.19.0-25-generic #26~14.04.1-Ubuntu
PHP (from APT): 7.0.8-0ubuntu0.16.04.2
with builtin pdo_dblib: 7.0.8-0ubuntu0.16.04.2
freetds (from APT): 0.91-6.1build1
Ubuntu: Linux 3.19.0-25-generic #26~14.04.1-Ubuntu
php (from APT): 5.5.9-1ubuntu4.14
with builtin pdo_dblib: 1.0.1
freetds (from APT): 0.91-5
两个设置中的/etc/freetds.config (both PHP 5.5 and 7 installation)
-------
tds version = 8.0