SqlServer nvarchar中的中文字符匹配,更改SqlServer實例和數據庫排序規則的辦法


我們都知道在SqlServer中的nvarchar類型可以完美的存儲諸如中文這種unicode字符,但是我們會發現有時候查詢語句去查詢nvarchar列的時候查不出來。

 

為什么nvarchar類型有時候需要前面帶N的字符串才能查出結果

比如假如現在有一張表T_UserInfo如下,其中列[Name]為nvarchar類型用於存儲中文姓名:

CREATE TABLE [dbo].[T_UserInfo](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL,
    [Age] [int] NULL,
 CONSTRAINT [PK_T_UserInfo] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

表中的數據如下圖所示:

運行如下Sql查詢,在有些環境是可以查出來結果的而有些環境卻查不出來結果。。。

select * from [dbo].[T_UserInfo] where Name='王強'

但是如果像下面這樣在字符串前面加上N,無論在什么環境上都可以正確地查詢出結果

select * from [dbo].[T_UserInfo] where Name=N'王強'

 

出現這種情況的原因就是因為SqlServer在安裝的時候有些環境選擇的排序規則是Latin1_General_CI_AS,而有些環境選擇的排序規則是Chinese_PRC_CI_AS,導致在SqlServer上新建的數據庫時有些排序規則是Latin1_General_CI_AS,有些是Chinese_PRC_CI_AS。

而當數據庫的排序規則是Latin1_General_CI_AS時,那么nvarchar類型的列必須用前面帶N的字符串去查詢才能查出結果,如下所示:

select * from [CustomerDB].[dbo].[T_UserInfo] where Name=N'王強'--如果數據庫[CustomerDB]的排序規則是Latin1_General_CI_AS那么必須要用N'王強'才能查詢到結果

而當數據庫的排序規則是Chinese_PRC_CI_AS時,那么nvarchar類型的列用前面帶N和不帶N的字符串都能查出結果,如下所示:

select * from [CustomerDB].[dbo].[T_UserInfo] where Name='王強'--如果數據庫[CustomerDB]的排序規則是Chinese_PRC_CI_AS,那么用N'王強'和'王強'都能查詢到結果

 

更改數據庫的排序規則

知道了這個問題那么我們來嘗試下更改數據庫的排序規則,如下圖所示當前SqlServer中數據庫CustomerDB的排序規則是Latin1_General_CI_AS的

現在我們使用下面的alter database語句將其排序規則改為Chinese_PRC_CI_AS(注意alter database語句需要在沒人用數據庫的時候才能成功執行,所以最好將數據庫設置為single user模式后,再運行alter database語句

alter database [CustomerDB] collate Chinese_PRC_CI_AS

然后再查看其數據庫屬性,發現CustomerDB的排序規則已經變為了Chinese_PRC_CI_AS

這個時候無論[T_UserInfo]表的[Name]列是什么排序規則,用N'王強'和'王強'都能查詢出來結果,例如下圖中我們看到雖然列[Name]的排序規則是Latin1_General_CI_AS,但是由於現在數據庫CustomerDB的排序規則是Chinese_PRC_CI_AS,所以用'王強'是可以查詢出結果的

 

 

更改數據庫實例的排序規則

我們知道新建數據庫時,數據庫的默認排序規則就是數據庫實例的當前排序規則,那么如果將數據庫實例的排序規則設置為我們想要的值后,新建的數據庫自然也是預期的排序規則,下面介紹如何用命令行更改數據庫實例的排序規則。

首先我們可以看到數據庫實例MSSQLSERVER當前的排序規則是Latin1_General_CI_AS

 

現在使用操作系統管理員權限啟動cmd,也就是命令行提示符,然后定位到SqlServer安裝文件所在的目錄,在本例中我的SqlServer安裝文件就在E盤(主要就是要找到安裝文件setup.exe所在的目錄)。

然后使用NET STOP MSSQLSERVER停止SqlServer服務,其中MSSQLSERVER就是你要更改SqlServer實例的windows服務名稱

然后在命令行中使用如下命令調用setup.exe(注意:當使用Setup命令后,所更改數據庫實例中的所有用戶數據庫都會被脫機(系統數據庫不會),你需要在使用Setup命令后重新附加所有的用戶數據庫到數據庫實例)

Setup /QUIET /ACTION=REBUILDDATABASE /instancename=<數據庫實例名> /SQLSYSADMINACCOUNTS=<數據庫管理員賬號> /sapwd=<數據庫管理員密碼> /sqlcollation=Chinese_PRC_CI_AS

雖然MSDN說上面的sapwd參數可以省略,但是測試發現如果省略了這個參數,待上面的setup命令執行完后,數據庫實例的排序規則還是沒有改變,所以這里建議一定要使用sapwd參數輸入數據庫管理員賬號的密碼

現在執行上面的Setup命令

等待幾分鍾的時間setup命令執行完畢,然后我們再使用NET START MSSQLSERVER命令啟動SqlServer服務

現在再查看數據庫實例MSSQLSERVER的排序規則,可以看到數據實例MSSQLSERVER的排序規則已經變為了Chinese_PRC_CI_AS

另外使用下面的Sql查詢也可以查到當前連接到數據庫實例的排序規則

select SERVERPROPERTY('collation')

 

SqlServer的排序規則關系到表的列,數據庫及數據庫實例,知道怎么配置排序規則對使用SqlServer還是比較重要的,希望通過本文大家能有所收獲,謝謝!

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com