Sql server 在带有FreeTDS/MSSQL的PHP7中,如果使用参数绑定,汉字会损坏, 复制脚本 问题描述

Sql server 在带有FreeTDS/MSSQL的PHP7中,如果使用参数绑定,汉字会损坏, 复制脚本 问题描述,sql-server,php-7,freetds,Sql Server,Php 7,Freetds,在PHP7中 对于代码段1,字符最终在数据库中损坏(Mojibake) 对于代码片段2,一切正常 在PHP5.5中,两个代码段都按预期工作 我们在将PHP5.5升级到PHP7时发现了这一点 所以问题是为什么代码片段1在PHP7设置中不起作用 其他资料 错误的设置(PHP7) 良好的设置(PHP5.5) 两种设置中的freetds配置 好的,这实际上是一个已知的错误- 并在PHP7.0.12中修复。这不会解决问题,但TDS 8.0版已弃用,不应使用。使用7.1或7.2。说来话长:恐怕8.0/7.1

在PHP7中

对于代码段1,字符最终在数据库中损坏(Mojibake)

对于代码片段2,一切正常

在PHP5.5中,两个代码段都按预期工作

我们在将PHP5.5升级到PHP7时发现了这一点

所以问题是为什么代码片段1在PHP7设置中不起作用

其他资料 错误的设置(PHP7) 良好的设置(PHP5.5) 两种设置中的freetds配置
好的,这实际上是一个已知的错误-
并在PHP7.0.12中修复。

这不会解决问题,但TDS 8.0版已弃用,不应使用。使用7.1或7.2。说来话长:恐怕8.0/7.1/7.2不是关键。更改为7.1/7.2时也是如此。此外,如果我们一起删除freetds.config,所有四个设置(PHP{5.5,7}*代码段{1,2})都会中断并给出mojibake。目前只有四分之一的设置,PHP7*Snippet1,不能像预期的那样工作。
$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);
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