PDO_ODBC的字符编码问题

时间:2010-08-12 11:32:24

标签: php drupal odbc pdo

使用以下代码使用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上运行。

5 个答案:

答案 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);

有关详细信息,请参阅下一页。

https://www.freetds.org/userguide/dsnless.html

答案 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";