Sql-Server

如何在準備好的 SELECT 語句中使用“N”

  • November 14, 2018

我正在使用 pdo 和 SQL Server 的 ODBC Driver 13 連接到 SQL Server 2008 數據庫。

我正在嘗試執行以下查詢來搜尋數據庫中的中文字元:

SELECT TOP (10) ... WHERE (sItemName LIKE N:term1)

       $text = "%简况%";
           $query = $this->DBH->prepare($sql);
           $query->bindParam(':term1', $text, PDO::PARAM_STR );
       $query->execute();

此查詢返回帶有隨機字元的結果,因此看起來字元編碼不正確。

通過使用 Heidi 在數據庫上直接執行此查詢,我能夠返回相同的結果:

SELECT TOP (10) ... WHERE (sItemName LIKE '%简况%')

通過在字元串返回正確結果之前添加“N”將查詢更改為以下內容:

SELECT TOP (10) ... WHERE (sItemName LIKE N'%简况%')

但是,當我嘗試對準備好的語句執行相同操作時,如下所示,出現語法錯誤:

SELECT TOP (10) ... WHERE (CI.sItemName LIKE N:term1)

       $text = "%简况%";
           $query = $this->DBH->prepare($sql);
           $query->bindParam(':term1', $text, PDO::PARAM_STR );
       $query->execute();

這是錯誤:

語法錯誤或訪問衝突:102

$$ Microsoft $$$$ ODBC Driver 13 for SQL Server $$$$ SQL Server $$‘N:’ 附近的語法不正確。

所以我的問題是如何在我準備好的語句中使用“N”而不會出錯。我不是貿易DBO,所以如果我遺漏了任何東西,我深表歉意!

這將返回預期結果:

$seach_term = (string)'简况';
$text = '%'.$seach_term.'%';
$query = $this->DBH->prepare("SELECT * FROM Articles WHERE sHeadline LIKE :term");
$query->bindParam(':term', $text, PDO::PARAM_STR);   

但使用 PARAM_STR_NATL 常量不會返回任何內容:

$query->bindParam(':term', $text, PDO::PARAM_STR_NATL);

PDO_PARAM_STR_NATL您應該使用(相對較新的)常量綁定它們。此常量在PHP 7.2 及更高版本中可用。它將導致**N**添加所需的前綴。

$query->bindParam(':term1', $text, PDO::PDO_PARAM_STR_NATL);

如果您有興趣,可以在這裡找到一些歷史記錄:

https ://bugs.php.net/bug.php?id=60818

那裡連結的 Github 送出顯示瞭如何**N**添加(第 178-184 行):

https ://github.com/php/php-src/commit/4afce8ec8c6660ebd9f9eb174d2614361d1c6129

N 僅用於文字。在準備好的語句中,您將類型參數綁定到參數佔位符。參數將輸入為 NVarchar 並設置為 Unicode 值。

引用自:https://dba.stackexchange.com/questions/222441