使用 SSMS 向 SQL Server 2005 插入中文資料,查詢結果卻顯示 ???。圖形化介面與 INSERT 語句皆同,查詢分析器亦然。排除輸入錯誤後,問題鎖定在排序規則設定錯誤。
該資料庫使用 SQL_Latin1_General_CP1_CI_AS,此排序規則不支援簡體中文字元集。支援簡體中文的三種排序規則:
Chinese_PRC_BIN(二進位排序)Chinese_PRC_CI_AS(不區分大小寫、區分重音)Chinese_PRC_CS_AS(區分大小寫、區分重音)將資料庫排序規則改為 Chinese_PRC_CI_AS 即解決問題。
MSDN 定義:排序規則控制字串實體儲存,指定字元位元模式與儲存/比較規則。實質上即字元編碼。
以 Chinese_PRC_CS_AI_WS 為例:
| 部分 | 範例 | 含義 |
|---|---|---|
| 前綴 | Chinese_PRC_ | 大陸簡體 Unicode 字元集 |
| 後綴 | _BIN | 二進位排序 |
| _CI / _CS | 不區分/區分大小寫 (Case Insensitive/Sensitive) | |
| _AI / _AS | 不區分/區分重音 (Accent Insensitive/Sensitive) | |
| _KI / _KS | 不區分/區分假名類型 | |
| _WI / _WS | 不區分/區分全半形寬度 (Width Insensitive/Sensitive) |
SELECT * FROM ::fn_helpcollations();
ALTER DATABASE [YourDB] COLLATE Chinese_PRC_CI_AS;
設計表時採用 nchar、nvarchar 等 N 開頭型別,無論資料庫排序規則為何,皆能正確儲存與顯示中文。
不變更結構,僅在字串常值前加 N:
-- 查詢
SELECT * FROM tb_Cust WHERE FirstName = N'汪';
-- 插入
INSERT tb_Cust (FirstName, LastName, Sex) VALUES (N'汪', N'鑫昊', N'男');
SQL Server 2000 之後,修改伺服器層級排序規則需重建 master 資料庫,風險極高,強烈不建議直接修改伺服器層級排序規則。
本文出自「我兒子真帥!」博客,請保留出處:https://alligator.blog.51cto.com/36993/79970