PDO + MsSQL + freetds = INSERT 查询中的错误字符
PDO + MsSQL + freetds = wrong characters in INSERT queries
在我的内部项目中 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
数据库字符集联盟是 Croatian_CI_AS。不幸的是,我无法更改它,因为它是旧数据库,旨在与旧应用程序一起使用,而对于该应用程序,我正在处理 Web 演示文稿。
一段时间后我找到了解决办法。这不是一个完美的,因为我需要处理每个值(这是对代码的小修复,但仍然不够干净)。如果有人有其他想法可以使这个更好,post,请。
$statement->bindValue(2, iconv('utf-8', 'Windows-1252', 'Beriša'), \PDO::PARAM_STR);
在我的内部项目中 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
数据库字符集联盟是 Croatian_CI_AS。不幸的是,我无法更改它,因为它是旧数据库,旨在与旧应用程序一起使用,而对于该应用程序,我正在处理 Web 演示文稿。
一段时间后我找到了解决办法。这不是一个完美的,因为我需要处理每个值(这是对代码的小修复,但仍然不够干净)。如果有人有其他想法可以使这个更好,post,请。
$statement->bindValue(2, iconv('utf-8', 'Windows-1252', 'Beriša'), \PDO::PARAM_STR);