如何通过带有查询的,包含西里尔符号的PHP PDO从MSSQL中正确选择?

时间:2019-01-29 11:34:01

标签: php sql-server pdo

我正在尝试从PHP PDO到MSSQL数据库执行简单的SELECT查询。当查询在WHERE条件下包含西里尔符号时,结果为空(如果不包含,则成功返回结果)。我该怎么做才能纠正查询?

putenv('ODBCSYSINI=/etc/');
putenv('ODBCINI=/etc/odbc.ini');

$configODBC = config('database.odbc');

try {

    $this->pdo = new PDO('odbc:'. $configODBC['default']['source'], $configODBC['default']['username'], $configODBC['default']['password']);


} catch (PDOException $e) {}
...

$statement      = $this->pdo->prepare("SELECT * FROM [DB].[dbo].table WHERE policy_num LIKE '%cyrillic_symbols%'");
$result         = $statement->execute();

if ($result) {

    while ($out = $statement->fetch()) {

        var_dump($out[0]);

    }
}

PS。 MSSQL版本2012。数据采用UTF-8编码。

1 个答案:

答案 0 :(得分:0)

我将其发布为答案,因为评论时间太长。 @RiggsFolly建议的UTF-8 all the way through具有所有答案。就您而言,您需要将CP-1251的值从UTF-8转换为CREATE TABLE CyrillicTable ( [CyrillicText] varchar(200) COLLATE Cyrillic_General_CI_AS ) INSERT INTO CyrillicTable (CyrillicText) VALUES ('Понедельник'), ('Вторник') 。我已经做了一个简单的测试用例,看看这是否对您有帮助:

T-SQL:

<?php
# Connection info
$hostname = 'server\instance,port';
$dbname   = 'database';
$username = 'uid';
$pw       = 'pwd';

# Connection
try {
    $dbh = new PDO("odbc:Driver={SQL Server Native Client 11.0};Server=$hostname;Database=$dbname", $username, $pw);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch( PDOException $e ) {
    die( "Error connecting to SQL Server. ".$e->getMessage());
}

# Query
try {
    echo "Query"."<br>";
    $sql = "SELECT * FROM dbo.[CyrillicTable] WHERE CyrillicText LIKE '%".iconv('UTF-8', 'CP1251', 'онед')."%'";
    $stmt = $dbh->query($sql);
    while ($row = $stmt->fetch( PDO::FETCH_ASSOC )) {
        foreach($row as $name => $value) {
            echo $name.": ".iconv('CP1251', 'UTF-8', $value)."<br>";
        }   
    }
    echo "<br>";
} catch( PDOException $e ) {
    die( "Error executing query: ".$e->getMessage());
}
$stmt = null;

# Query
try {
    echo "Prepared query"."<br>";
    $sql = "SELECT * FROM dbo.[CyrillicTable] WHERE CyrillicText LIKE ?";
    $stmt = $dbh->prepare($sql);
    $text = 'орни';
    $text = "%$text%";
    $text = iconv('UTF-8', 'CP1251', $text);
    $stmt->bindParam(1, $text, PDO::PARAM_STR);
    $stmt->execute();
    while ($row = $stmt->fetch( PDO::FETCH_ASSOC )) {
        foreach($row as $name => $value) {
            echo $name.": ".iconv('CP1251', 'UTF-8', $value)."<br>";
        }   
    }
    echo "<br>";
} catch( PDOException $e ) {
    die( "Error executing stored procedure: ".$e->getMessage());
}
$stmt = null;


# End
$dbh = null;
?>

PHP(使用记事本++文件是UTF-8编码的):

@Formula

注意:

考虑使用参数化查询。