代码之家  ›  专栏  ›  技术社区  ›  HelloSam

在具有FreeTDS/MSSQL的PHP7中,如果使用参数绑定,

  •  1
  • HelloSam  · 技术社区  · 9 年前

    复制脚本

    $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);
    

    问题描述

    在PHP7中,

    对于代码片段1,字符在数据库中被损坏(Mojibake)。

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

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

    我们在将PHP 5.5升级到PHP 7时发现了这一点。

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

    其他信息

    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
    

    良好的设置(PHP5.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 回复  |  直到 9 年前
        1
  •  1
  •   HelloSam    9 年前

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