SQL Server排序規則
--SQLSERVER中的排序規則 伺服器-》資料庫-》表列
--參考:http://www.jb51.net/article/889.htm
---------------------------------排序規則簡介--------------------------------
--什麼叫排序規則呢?MS是這樣描述的:"在 Microsoft SQL Server 2000 中,
--字串的物理儲存由排序規則控制。排序規則指定表示每個字元的位模式以及存
--儲和比較字元所使用的規則。"
-- 在查詢分析器內執行下面語句,可以得到SQL SERVER支援的所有排序規則。
--
-- select * from ::fn_helpcollations()
--
--排序規則名稱由兩部份構成,前半部份是指本排序規則所支援的字符集。
--如:
-- Chinese_PRC_CS_AI_WS
--前半部份:指UNICODE字符集,Chinese_PRC_指標對大陸簡體字UNICODE的排序規則。
--排序規則的後半部份即字尾 含義:
-- _BIN 二進位制排序
-- _CI(CS) 是否區分大小寫,CI不區分,CS區分
-- _AI(AS) 是否區分重音,AI不區分,AS區分
-- _KI(KS) 是否區分假名型別,KI不區分,KS區分
--_WI(WS) 是否區分寬度 WI不區分,WS區分
--
--區分大小寫:如果想讓比較將大寫字母和小寫字母視為不等,請選擇該選項。
--區分重音:如果想讓比較將重音和非重音字母視為不等,請選擇該選項。如果選擇該選項,
--比較還將重音不同的字母視為不等。
--區分假名:如果想讓比較將片假名和平假名日語音節視為不等,請選擇該選項。
--區分寬度:如果想讓比較將半形字元和全形字元視為不等,請選擇該選項
-------------------------------------------------------------------------------------
sp_helpsort
SELECT SERVERPROPERTY ('Collation')
--------------------------------------------
--2.更改伺服器排序規則
--更改 SQL Server 2005 例項的預設排序規則的操作可能會比較複雜,包括以下步驟:
--確保具有重新建立使用者資料庫及這些資料庫中的所有物件所需的全部資訊或指令碼。
--使用工具(例如大容量複製)匯出所有資料。
--刪除所有使用者資料庫。
--重新生成在 setup 命令的 SQLCOLLATION 屬性中指定新的排序規則的 master 資料庫。例如:
--複製程式碼
start /wait setup.exe /qb INSTANCENAME=MSSQLSERVER REINSTALL=SQL_Engine REBUILDDATABASE=1 SAPWD=test SQLCOLLATION=SQL_Latin1_General_CP1_CI_AI
--有關重新生成 master 資料庫的詳細資訊,請參閱如何重新生成 SQL Server 2005 的 Master 資料庫。
--建立所有資料庫及這些資料庫中的所有物件。
--匯入所有資料。
--注意:
--可以為建立的每個新資料庫指定預設排序規則,而不更改 SQL Server 2005 例項的預設排序規則。
-----------------------------------------------------------------------------------
--3.設定和更改資料庫排序規則
--建立新資料庫時,可以使用下列內容之一指定排序規則:
--CREATE DATABASE 語句的 COLLATE 子句。
--SQL Server Management Studio.
--SQL 管理物件 (SMO) 中的 Database.Collation 屬性。
--如果未指定排序規則,則使用伺服器排序規則。
--可以使用 ALTER DATABASE 語句的 COLLATE 子句來更改在使用者資料庫中建立的任何新物件的排序規則。使用此語句不能更改任何現有使用者定義的表中列的排序規則。使用 ALTER TABLE 的 COLLATE 子句可以更改這些列的排序規則。
--更改資料庫排序規則時,需要更改下列內容:
--資料庫的預設排序規則,這一新的預設排序規則將應用於資料庫中後續建立的所有列、使用者定義的資料型別、變數和引數。根據資料庫中定義的物件解析 SQL 語句中指定的物件識別符號時,也使用新的預設排序規則。
--將系統表中的任何 char、varchar、text、nchar、nvarchar 或 ntext 列更改為使用新的排序規則。
--將儲存過程和使用者定義函式的所有現有 char、varchar、text、nchar、nvarchar 或 ntext 引數和標量返回值更改為使用新的排序規則。
--將 char、varchar、text、nchar、nvarchar 或 ntext 系統資料型別和基於這些系統資料型別的所有使用者定義的資料型別更改為使用新的預設排序規則。
--SQL code :
--------------------------資料庫----------------------------------------
--1.將資料庫的字符集修改為:
ALTER DATABASE [pratice] COLLATE Chinese_PRC_CI_AS
--2.為資料庫指定排序規則
CREATE DATABASE db COLLATE Chinese_PRC_CI_AS
GO
ALTER DATABASE db COLLATE Chinese_PRC_BIN
GO
ALTER DATABASE [pratice] COLLATE Chinese_PRC_CS_AS --區分大小寫
ALTER DATABASE [pratice] COLLATE Chinese_PRC_CI_AS --不區分大小寫
---------------------------表中的列---------------------------------------
--為表中的列指定排序規則
CREATE TABLE tb
(
col1 VARCHAR(10) ,
col2 VARCHAR(10) COLLATE Chinese_PRC_CI_AS
)
GO
ALTER TABLE tb ADD col3 VARCHAR(10) COLLATE Chinese_PRC_BIN
GO
ALTER TABLE tb ALTER COLUMN col2 VARCHAR(10) COLLATE Latin1_General_CS_AS_KS_WS
GO
ALTER TABLE tb ALTER COLUMN colname NVARCHAR(100) COLLATE Chinese_PRC_CI_AS --不區分大小寫
ALTER TABLE tb ALTER COLUMN colname NVARCHAR(100) COLLATE Chinese_PRC_CS_AS --區分大小寫
---------------------------------------------------------------------
--3. 為字元變數和引數應用排序規則
DECLARE @a VARCHAR(10) ,
@b VARCHAR(10)
SELECT @a = 'a' ,
@b = 'A'
--使用排序規則 Chinese_PRC_CI_AS
SELECT CASE WHEN @a COLLATE Chinese_PRC_CI_AS = @b THEN '@ [email protected]' --Chinese_PRC_CI_AS不區分大小寫
ELSE '@a<>@b'
END
--結果:@[email protected]
--使用排序規則 Chinese_PRC_BIN
SELECT CASE WHEN @a COLLATE Chinese_PRC_BIN = @b THEN '@[email protected]'
ELSE '@a<>@b'
END
--結果:@a<>@b
---------------------------SQL2000適用------------------------------------------------------
--方法一.安裝SQL2000時選擇區分大小寫或安裝完以後重建mastar,選擇區分大小
--C:\Program Files\Microsoft SQL Server\80\Tools\Binn\rebuildm.exe
--方法二.sql server 8.0以上的版本才可以,7.0及其以下不支援
ALTER DATABASE [pratice] COLLATE Chinese_PRC_CS_AS
--修改排序規則,改成大小寫敏感的排序規則
--如果只修改一個表,用alter table語句
--如果修改一個庫的預設排序規則,用alter datebase語句
--如果修改整個伺服器的預設排序規則,用Rebuildm.exe重建master庫
--指定排序規則就可以了
-------------------------------------------------------------------
--注意需要使用NVARCHAR()資料型別!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
--因為排序規則而出錯的例子
--USE [tempdb]
--GO
--DROP TABLE #t1
--DROP TABLE #t2
CREATE TABLE #t1
(
value INT ,
name NVARCHAR(20) COLLATE Albanian_CI_AI_WS
)
CREATE TABLE #t2
(
value INT ,
name NVARCHAR(20) COLLATE Chinese_PRC_CI_AI_WS
)
INSERT #t1
SELECT 1 ,
'中'
UNION ALL
SELECT 2 ,
'國'
UNION ALL
SELECT 3 ,
'人'
UNION ALL
SELECT 4 ,
'阿'
INSERT #t2
SELECT 1 ,
'親'
UNION ALL
SELECT 2 ,
'國'
UNION ALL
SELECT 3 ,
'好'
UNION ALL
SELECT 4 ,
'阿'
SELECT * FROM #t1 A INNER JOIN #t2 B ON A.name = B.name
--解決方法
SELECT * FROM #t1 A INNER JOIN #t2 B ON A.name = B.name COLLATE Chinese_PRC_CI_AI_WS
---------------------------------------------------------------------------------------
--例1:讓表NAME列的內容按拼音排序:
CREATE TABLE #t1
(
value INT ,
name NVARCHAR(20) COLLATE Albanian_CI_AI_WS
)
INSERT #t1
SELECT 1 ,
'中'
UNION ALL
SELECT 2 ,
'國'
UNION ALL
SELECT 3 ,
'人'
UNION ALL
SELECT 4 ,
'阿'
SELECT * FROM #t1 ORDER BY name COLLATE Chinese_PRC_CS_AS_KS_WS
/*結果:
id name
----------- --------------------
4 阿
2 國
3 人
1 中
*/
-------------------------------------------------------------------------
--例2:讓表NAME列的內容按姓氏筆劃排序:
create table #t(id int,name NVARCHAR(20))
insert #t select 1,'三'
union all select 2,'乙'
union all select 3,'二'
union all select 4,'一'
union all select 5,'十'
select * from #t order by name collate Chinese_PRC_Stroke_CS_AS_KS_WS
drop table #t
/*結果:
id name
----------- --------------------
4 一
2 乙
3 二
5 十
1 三
*/
---------------------------計算漢字的筆劃---------------------------------------------
-- 上面所有準備過程,只是為了寫下面這個函式,這個函式撇開上面建的所有臨時表和固
--定表,為了通用和程式碼轉移方便,把表tab_hzbh的內容寫在語句內,然後計算使用者輸入一串
--漢字的總筆劃:
USE [tempdb]
GO
create function fun_getbh(@str nvarchar(4000))
returns int
as
begin
declare @word nchar(1),@n int
set @n=0
while len(@str)>0
begin
set @word=left(@str,1)
--如果非漢字,筆劃當0計
set @ [email protected]+(case when unicode(@word) between 19968 and 19968+20901
then (select top 1 id from (
select 1 as id,N'亅' as word
union all select 2,N'阝'
union all select 3,N'馬'
union all select 4,N'風'
union all select 5,N'龍'
union all select 6,N'齊'
union all select 7,N'龜'
union all select 8,N'齒'
union all select 9,N'鴆'
union all select 10,N'齔'
union all select 11,N'龕'
union all select 12,N'齗'
union all select 13,N'齠'
union all select 14,N'齦'
union all select 15,N'齪'
union all select 16,N'龍'
union all select 17,N'龠'
union all select 18,N'龎'
union all select 19,N'龐'
union all select 20,N'龑'
union all select 21,N'龡'
union all select 22,N'龢'
union all select 23,N'龝'
union all select 24,N'齹'
union all select 25,N'龣'
union all select 26,N'龥'
union all select 27,N'齈'
union all select 28,N'龞'
union all select 29,N'麷'
union all select 30,N'鸞'
union all select 31,N'麣'
union all select 32,N'龖'
union all select 33,N'龗'
union all select 35,N'齾'
union all select 36,N'齉'
union all select 39,N'靐'
union all select 64,N'龘'
) T
where word> [email protected] collate Chinese_PRC_Stroke_CS_AS_KS_WS
order by id ASC) else 0 end)
set @str=right(@str,len(@str)-1)
end
return @n
END
select dbo.fun_getbh('中華'),dbo.fun_getbh('中華人民共和國')
--簡繁體都行
-------------------------------------------------------------------------
--用排序規則的特性得到漢字拼音首字母
--用得到筆劃總數相同的方法,我們也可以寫出求漢字拼音首字母的函式。如下:
USE [tempdb]
GO
create function fun_getPY(@str nvarchar(4000))
returns nvarchar(4000)
as
begin
declare @word nchar(1),@PY nvarchar(4000)
set @PY=''
while len(@str)>0
begin
set @word=left(@str,1)
--如果非漢字字元,返回原字元
set @[email protected]+(case when unicode(@word) between 19968 and 19968+20901
then (select top 1 PY from (
select 'A' as PY,N'驁' as word
union all select 'B',N'簿'
union all select 'C',N'錯'
union all select 'D',N'鵽'
union all select 'E',N'樲'
union all select 'F',N'鰒'
union all select 'G',N'腂'
union all select 'H',N'夻'
union all select 'J',N'攈'
union all select 'K',N'穒'
union all select 'L',N'鱳'
union all select 'M',N'旀'
union all select 'N',N'桛'
union all select 'O',N'漚'
union all select 'P',N'曝'
union all select 'Q',N'囕'
union all select 'R',N'鶸'
union all select 'S',N'蜶'
union all select 'T',N'籜'
union all select 'W',N'鶩'
union all select 'X',N'鑂'
union all select 'Y',N'韻'
union all select 'Z',N'咗'
) T
where word>[email protected] collate Chinese_PRC_CS_AS_KS_WS
order by PY ASC) else @word end)
set @str=right(@str,len(@str)-1)
end
return @PY
end
select dbo.fun_getPY('中華'),dbo.fun_getPY('中華人民共和國')
--結果都為:ZHRMGHG
-------------------------------------------------------------------------
--先用SQLSERVER方法得到所有漢字,不用字典,我們簡單利用SQL語句就可以得到:
select top 20902 code=identity(int,19968,1) into #t from syscolumns a,syscolumns b
select code,nchar(code) as CNWord from #t
--然後,我們用Select語句,讓它按筆劃排序。
select code,nchar(code) as CNWord
from #t
order by nchar(code) collate Chinese_PRC_Stroke_CS_AS_KS_WS,code
相關推薦
SQL SERVER--- 排序規則、數據類型
除了 沒有 部分 money database 參數 chinese collate 內部 一、排序規則 有時候我們向數據庫插入文本時,會出現亂碼“?”,這時有可能是我們創建數據庫沒有設置好排序規則 以 Chinese_PRC_CI_AS 為例 前半部分Chinese_
SQL Server排序規則
--SQLSERVER中的排序規則 伺服器-》資料庫-》表列 --參考:http://www.jb51.net/article/889.htm ---------------------------------排序規則簡介------------------------
SQL Server 排序的時候使 null 值排在最後
rim create pri lec sel arch 解決方法 not lba 最近遇到一個 SQL Server 排序的問題,以前也沒了解過,然後這次碰到了。 才發現 SQL Server 排序的問題,在指定的排序列中 null 值會默認排在最前面,因為在 SQL Se
SQL server排序時如何將NULL排在最後面
下面先直接排序看下效果 select UserInfoID,User_No,User_Names from UserInfo order by User_NO asc 可以看到指定排序的列,其值為 null 的排在了最前面。 下面就是解決辦法。 sele
SQL Server 與MySQL中排序規則與字符集相關知識的一點總結
bubuko col https 中文字符集 目前 創建 har 運算 進制 原文:SQL Server 與MySQL中排序規則與字符集相關知識的一點總結 字符集&&排序規則 字符集是針對不同語言的字符編碼的集合,比如UTF-8字符集,GBK字符集,G
修改sql server資料庫預設排序規則
公司新換了一批電腦。同事幫我把開發工具都裝好了。使用sqlserver2012時,發現 sqlcollation 用的是 Chinese_PRC_CI_AS 。我需要 SQL_Latin1_General_CP1_CI_AS 只好對整個資料庫進行 更改。 1、先停止需要變
SQL Server 更改排序規則
最近因為測試環境 MSSQL 伺服器排序規則區分大小寫,導致實用到臨時表(tempdb)的資料、臨時物件都區分了大小寫。所以重建了系統資料庫並更改了排序規則,這裡再次總結一下。 開始之前,先確認排序規則(或大小寫是否敏感) --檢視伺服器排序規則(安裝時指定的排序規則)
SQL Server之排序函數
多條 數據分區 com log server2 窗函數 tro 原理 clas Sql Server2005數據庫自帶一個排序函數ROW_NUMBER(),列表為: 語法:row_number() : over(子句)1.使用row_number()函數進行編號: sel
SQL Server排名或排序的函數
order by 余數 分區 cat 並且 全部 src 記錄 例如 SQL Server獲得排名或排序的函數有例如以下幾種: 1、Rank:在結果集中每一條記錄所在的排名位置,但排名可能不連續,比如:若同一組內有兩個第一名,則該組內下一個名次直接跳至第三名
SQL SERVER 字串按數字排序
需求是這樣的: 資料庫表裡面有一個欄位型別是nvachar,存的值是數字和字元混合的,要實現先按數字排序,再按字母倒序。 思路: 考慮這個欄位的值是否是有規律可循的,把要按數字排序的部分轉換為數字,再把剩下的字元排序。 資料表是下面這樣的: LevelName就是那
sql collate 子句 排序規則
排序規則沖突 數據庫排序 服務器 color data 麻煩 varchar 建議 style SQL SERVER的排序規則平時使用不是很多,也許不少初學者還比較陌生,但有一個錯誤大家應是經常碰到: SQL SERVER數據庫,在跨庫多表連接查詢時,若兩數據庫默認字符集不
SQL server基礎的增刪改查 分組 排序
查:select * from 表名,加條件的話後加where條件 增:insert into 表名 ralues(“1” “2” “3”)123為值(要與資料庫的資料保持一致)後不用加條件 刪:delete from 表名,後必須加條件where id=2,如
安裝SQL Server 2014出現錯誤 “合成活動模板庫(ATL) 規則 失敗”
(方法1)檢視安裝日誌(或者大部分網頁上的建議),其是提醒你重啟系統後再次進行安裝。此方法若不能解決問題,請參照(方法2)。 (方法2)安裝映象支援程式:SQLSUPPORT.MSI(即sqlsupport.msi) 問題 : SQLSUPPORT.MSI究竟在
解決SQL Server查詢中使用Union或Union All後Order by排序無效的bug(好神奇啊!!)
http://www.ourcodelife.com/article-415-1.html 首先,在程式人生網站上,需要負責任的指出的是在SQL Server查詢中使用Union或Union All後Order by排序無效,我不確認是不是微軟的bug,不過這裡卻是我實際程式設計工作的經驗,但願大家看到
SQL Server——保證資料的完整性(使用者自定義資料型別、使用規則、解除和刪除規則)
目錄 一、使用者自定義資料型別 二、使用規則 規則和CHECK約束的比較: 三、解除和刪除規則 一、使用者自定義資料型別 使用者自己設計並實現的資料型別就是使用者自定義資料型別。舉例:當幾個表中要存同種資料型別時,並且保證他們有相同的資料型別、長度和
SQL SERVER 子查詢使用Order By;按In排序
【子查詢】使用order by select * from (select top 100 percent * from table order by id) a 這是發現結果沒有按id排序,需要將100 percent 改成 99.999 percent 或10000000(儘量大)
安裝SQL Server出現 Microsoft .NET Framework 3.5 Service Pack 1 規則失敗提示
環境: Windows Server 2008 R2 SP1 SQL Server 2012 現象:安裝SQL Server過程中出現如下圖所示提示資訊 原因:SQL Server需要 NET Fram
安裝或解除安裝SQL Server 2008時,提示“安裝程式支援規則---重新啟動計算機”失敗的解決辦法
剛才在解除安裝SQL Server 2008時,提示“安裝程式支援規則---重新啟動計算機”失敗,於是按提示重新啟動了一次,再來解除安裝,依然如故。 於是google了下解決方法。 很簡單,開啟登錄檔,找到: 鍵路徑:HKEY_LOCAL_MACHINE/SYSTEM/C
檢視SQLserver編碼格式的SQL語句 及 Sqlserver排序規則
SELECT COLLATIONPROPERTY('Chinese_PRC_Stroke_CI_AI_KS_WS', 'CodePage') 下面是查詢結果: 936 簡體中文GBK 950 繁體中文BIG5 437 美國/加拿大英語 932 日文 949 韓
SQL Server索引應遵循哪些規則
但是,不是在任何時候使用索引都能夠達到這種效果。若在不恰當的場合下,使用索引反而會事與願違。所以,在SQL Server資料庫中使用索引的話,還是需要遵守一定的規則。筆者覺得,主要是需要遵守六大鐵律。 鐵律一:天下沒有免費的午餐,使用索引是需要付出代價的 索引的優點有目共睹,但是,卻很少有人關心過採用