在PHP7中使用FreeTDS / MSSQL,如果使用参数绑定,中文字符会被破坏,

时间:2016-10-11 07:40:21

标签: sql-server php-7 freetds

Repro脚本

$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设置中不起作用?

其他信息

错误设置(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

良好设置(PHP 5.5)

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
两个设置中的

freetds配置

/etc/freetds.config (both PHP 5.5 and 7 installation)
-------
tds version = 8.0

1 个答案:

答案 0 :(得分:1)

好吧,它确实是一个已知的错误 - https://bugs.php.net/bug.php?id=72414 并在PHP 7.0.12中修复。