首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

深入理解 SQL Server 排序規則:中文亂碼根因與三種解決方案

     編輯:關於SqlServer

案例現象

使用 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;

方案二:使用 Unicode 型別欄位

設計表時採用 nchar、nvarchar 等 N 開頭型別,無論資料庫排序規則為何,皆能正確儲存與顯示中文。

方案三:SQL 語句前綴 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

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