首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL Server 查詢中文參數需加 N 前綴

     編輯:程式設計綜合問答

問題

變數 `@name` 含中文時,`WHERE stuffname = @name` 查無結果。

原因

字串常值預設為 **非 Unicode**(`varchar`),中文需 **Unicode**(`nvarchar`)。若欄位 `stuffname` 為 `nvarchar`/`nchar`,比較時隱性轉換可能導致索引失效或編碼不匹配。

解決:加 N 前綴

DECLARE @name NVARCHAR(128);
SET @name = N'中國'; -- 關鍵:N 前綴表示 Unicode 字串常值

SELECT stuffname 
FROM huqiangdataset.dbo.T_stainlesssteelstuff 
WHERE stuffname = @name;

完整驗證腳本

CREATE TABLE T1 (NAME NVARCHAR(255));
INSERT INTO T1 VALUES (N'中國'), (N'北京'), (N'上海');

DECLARE @NAME NCHAR(128);
SET @NAME = N'中國'; -- 加 N
SELECT * FROM T1 WHERE NAME = @NAME; -- 正確返回

SET @NAME = '中國'; -- 不加 N
SELECT * FROM T1 WHERE NAME = @NAME; -- 可能查無結果或掃描

DROP TABLE T1;

最佳實踐

  1. 所有 Unicode 字串常值加 `N`:`N'中文'`、`N'日本語'`。
  2. 變數宣告用 `NVARCHAR`/`NCHAR`**:`DECLARE @v NVARCHAR(100);`。
  3. 參數化查詢:應用程式端(C#/Java)使用參數化命令,驅動程式自動處理 Unicode,無需手動加 `N`。
    // C# 範例
    cmd.CommandText = "SELECT * FROM T1 WHERE NAME = @name";
    cmd.Parameters.AddWithValue("@name", "中文"); // 自動對應 NVarChar
  4. 資料庫排序規則**:確保資料庫/欄位排序規則支援中文(如 `Chinese_PRC_CI_AS`)。

補充:隱性轉換效能影響

`WHERE nvarchar_col = 'varchar_literal'` 會觸發**隱性轉換**,導致**索引掃描**而非索引查找,大表效能嚴重下降。加 `N` 可避免此問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved