PDO + MsSQL + freetds = INSERT查询中的错误字符

时间:2016-12-26 03:04:05

标签: php sql-server pdo freetds bindvalue

我在内部项目的SELECT查询中发现了一个问题,关于utf8字符(šđčćž)。在修复了freetds.conf中关于字符集和版本的freetds定义的问题之后,当我运行SELECT查询时,我开始收到正确的字符。

但是!现在,当我尝试使用其中一些字符(šđčćž)搜索字段时,我遇到了有关INSERT / UPDATE查询和SELECT查询的问题,而且这只是使用PDO bindValue方法。

例如,这是我的代码:

try {
$pdo = new \PDO(
      "dblib:host=$host:$port;dbname=$database",
      "$username",
      "$password"
   );
   $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
   echo "There was a problem connecting. " . $e->getMessage();
}

当我尝试使用以下代码插入值时,数据库中插入的值是正确的:

$query = "INSERT INTO dbo.TABLE (ID, NAME) VALUES (2, 'Beriša');";
$statement = $pdo->prepare($query);
$statement->execute();

//Result:
//2 Beriša

但是,使用bindValue方法(我必须使用它,因为我使用Symfony2),问题发生了:

$query = "INSERT INTO dbo.TABLE (ID, NAME) VALUES (?, ?);";
$statement = $pdo->prepare($query);
$statement->bindValue(1, 2, \PDO::PARAM_INT);
$statement->bindValue(2, 'Beriša', \PDO::PARAM_STR);
$statement->execute();

//Result:
//2 Beriša

Bellow,你可以找到我目前的freetds配置:

[global]
    tds version = 8.0
    text size = 20971520
    client charset = UTF-8

数据库字符集联盟是Croatian_CI_AS。不幸的是,我无法改变它,因为它是旧的数据库,旨在使用旧的应用程序,而对于该应用程序,我正在进行Web演示。

1 个答案:

答案 0 :(得分:1)

一段时间后我找到了解决方案。它不是一个完美的,因为我需要处理每个值(它是代码的小修复,但仍然不够干净)。如果有人有另一个想法让这个更好,请发布,请等。

$statement->bindValue(2, iconv('utf-8', 'Windows-1252', 'Beriša'), \PDO::PARAM_STR);