代码之家  ›  专栏  ›  技术社区  ›  Pierre Buyle

PDO\u ODBC的字符编码问题

  •  7
  • Pierre Buyle  · 技术社区  · 16 年前

    当使用PDO\u ODBC和以下代码从PHP访问microsoftsql数据库时,我遇到了一个编码问题。当输出的文本从数据库是乱码。

    $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
    (来源: bayimg.com

    这是从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'); 之后 新PDO(…)

    PS:代码目前是在Windows上开发的,但它也必须在GNU/Linux上工作。

    4 回复  |  直到 7 年前
        1
  •  5
  •   Pierre Buyle    15 年前

    在Linux上运行并使用FreeTDS驱动程序时,可以使用 client charset 设置在 freetds.conf 文件。为了 freetds.conf文件 ODBC-combined configuration . 什么时候? ODBC-only configuration 用于配置ODBC数据源 freetds.conf文件 未使用。有了它,我可以从mssqlserver数据库中检索并插入UTF-8数据。

    作为一个Linux/Unix的家伙,我无法理解/找到一种方法来配置在Windows上使用pdodbc时使用的字符集。我模糊的理解是,在系统级配置时,可以将ODBC数据源配置为使用de-sqlserver数据库的字符集或转换为客户端计算机的字符集。

        2
  •  1
  •   Veggivore    14 年前

    将字符编码设置为UTF-8时,还需要将查询编码为UTF-8并对结果进行解码。字符集告诉驱动程序您本机讲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);
    
        3
  •  1
  •   Aliqua    6 年前

    可以在连接字符串中使用ClientCharset属性(不带空格)设置所需的字符编码。

    $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

        4
  •  0
  •   Pacho Zuñiga    10 年前

    您可以使用以下代码修复问题:

    $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;
    }
    
        5
  •  0
  •   Cemil şen    9 年前

    您可以使用以下代码修复问题:

    弗斯特 后期数据转换

    '$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";