使用以下代码使用PDO_ODBC从PHP访问Microsoft SQL数据库时,我遇到了编码问题。当输出时,DB中的文本会出现乱码。
$dsn = "odbc:DRIVER={SQL Server};SERVER=$hostname;DATABASE=$database;charset=UTF-8";
$pdo = new PDO($dsn,$username,$password);
$sql = "SELECT text FROM atable";
$result = $PDO->query($sql);
while($data = $result->fetchObject()){
$values[] = $data->text;
}
dpm($values);
garbled output http://image.bayimg.com/naomcaacd.jpg
这是从Drupal模块完成的。 Drupal中的所有内容都与UTF-8一起使用。最干净的解决方案是能够以UTF-8从数据库中检索数据,或者在输出之前将其转换为UTF-8。
我尝试了这些没有成功
$dsn = "odbc:DRIVER={SQL Server};SERVER=$hostname;DATABASE=$database;client_charset=utf-8"
$dsn = "odbc:DRIVER={SQL Server};SERVER=$hostname;DATABASE=$database;charset=utf-8"
$pdo->exec('SET NAMES utf8')
之后new PDO(...)
在$pdo->exec('SET CHARACTER SET utf8');
new PDO(...)
PS:代码目前是在Windows上开发的,但它也必须在GNU / Linux上运行。
答案 0 :(得分:5)
在Linux上运行并使用FreeTDS驱动程序时,可以使用freetds.conf
文件中的client charset
设置配置客户端的字符集。为了在使用PDO ODBC和unixODBC时使用freetds.conf
文件,需要使用ODBC-combined configuration配置ODBC数据源。使用ODBC-only configuration配置ODBC数据源时,不使用文件freetds.conf
。有了这个,我就能够从MS SQL Server数据库中检索并插入UTF-8数据。
作为Linux / Unix的人,我无法理解/找到如何配置在Windows上使用PDO ODBC时使用的字符集的方法。我的含糊理解是,在系统级配置时,可以将ODBC数据源配置为使用de SQL Server数据库的charset或转换为客户端计算机字符集。
答案 1 :(得分:2)
将字符编码设置为UTF-8时,您还需要将查询编码为UTF-8并对结果进行解码。 charset告诉司机你本地说UTF8。因此,您需要将UTF8转换回PHP理解的内容(ASCII或mbstring)。
$dsn = "odbc:DRIVER={SQL Server};SERVER=$hostname;DATABASE=$database;charset=UTF-8";
$pdo = new PDO($dsn,$username,$password);
$sql = utf8_encode("SELECT text FROM atable");
$result = $PDO->query($sql);
while($data = $result->fetchObject()){
$values[] = utf8_decode($data->text);
// possibly also: $values[] = utf8_decode($data[utf8_encode('text')]);
}
dpm($values);
答案 2 :(得分:1)
您可以在连接字符串中使用ClientCharset属性(不带空格)设置所需的字符编码。 就我而言,它是UTF-8。
$connection_string = "DRIVER={FreeTDS};SERVER={$serverip};Port=1433;DATABASE={$dbname};ClientCharset={UTF-8}";
$conn = odbc_connect($connection_string,$username,$pwd);
有关详细信息,请参阅下一页。
答案 3 :(得分:0)
您可以使用此代码来解决问题:
$result = odbc_exec($this->con, $sql);
$data = fetch2Array($result);
private function fetch2Array($result){
$rows = array();
while($myRow = odbc_fetch_array( $result )){
$rows[] = $this->arrayToUTF($myRow);
}
return $rows;
}
private function arrayToUTF($arr){
foreach ($arr as $key => $value) {
$arr[$key] = utf8_encode($value);
}
return $arr;
}
答案 4 :(得分:0)
您可以使用此代码来解决问题:
<强>首先 发布数据转换
'$word = iconv("UTF-8","Windows-1254",$_POST['search']);'
并 读取数据转换
while($data = $result->fetchObject()){
$values[] = iconv("Windows-1254", "UTF-8",$data->text));
}
SQL字符串
$sql = "SELECT * FROM yourtables WHERE text LIKE '%{$word}%'";
or
$sql = "SELECT * FROM yourtables";