【问题标题】:PDO + MsSQL + freetds = wrong characters in INSERT queriesPDO + MsSQL + freetds = INSERT 查询中的错误字符
【发布时间】:2017-05-10 14:41:18
【问题描述】:

我在内部项目中的 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

下面,你可以找到我当前的 freetds 配置:

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

数据库字符集联盟是克罗地亚语_CI_AS。不幸的是,我无法更改它,因为它是旧数据库,旨在与旧应用程序一起使用,而我正在针对该应用程序进行 Web 演示。

【问题讨论】:

  • 在连接的dsn中传递utf8
  • 如果你想: $pdo = new \PDO( "dblib:host=$host:$port;dbname=$database;charset=utf8", "$username", "$password" );已经累了,也没用。
  • @MarkoMilojevic 我无法重现您的问题,它对我有用,也许这会有所帮助$statement->bindValue(2, utf8_encode('Beriša'), \PDO::PARAM_STR);
  • @meda 我试过了,但没有结果。尽管如此,类似的解决方案还是给了我结果(见下面的答案)。也许,您可以找到更清洁的解决方案(考虑下面的答案作为一个想法)。
  • 你在 SQL server 中使用了什么数据类型

标签: php sql-server pdo freetds bindvalue


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多