Sql-Server
如何在準備好的 SELECT 語句中使用“N”
我正在使用 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 值。