access數據庫排序規則,[轉]排序規則

 2023-11-19 阅读 23 评论 0

摘要:/* 排序規則根據特定語言和區域設置的標準指定對 字符串 數據 進行排序和比較的規則。 以 ORDER BY 子句為例:如果按升序排列,說英語的人認為字符串 Chiapas 應排在 Colima 之前。 但是,對于在墨西哥說西班牙語的人來說,他們會認為以 Ch 開頭的單

/*
排序規則根據特定語言和區域設置的標準指定對 字符串 數據 進行排序和比較的規則。
以 ORDER BY 子句為例:如果按升序排列,說英語的人認為字符串 Chiapas 應排在 Colima 之前。
但是,對于在墨西哥說西班牙語的人來說,他們會認為以 Ch 開頭的單詞應顯示在以 C 開頭的單詞列表的末尾。
排序規則規定了這些排序和比較規則。Latin_1 General 排序規則在 ORDER BY ASC 子句中將 Chiapas 排在 Colima 之前,
而 Traditional_Spanish 排序規則將 Chiapas 排在 Colima 之后。

排序規則名稱由兩部份構成,前半部份是指本排序規則所支持的字符集。
如:
  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區分 

區分大小寫:如果想讓比較將大寫字母和小寫字母視為不等,請選擇該選項。
區分重音:如果想讓比較將重音和非重音字母視為不等,請選擇該選項。如果選擇該選項,比較還將重音不同的字母視為不等。
區分假名:如果想讓比較將片假名和平假名日語音節視為不等,請選擇該選項。
區分寬度:如果想讓比較將半角字符和全角字符視為不等,請選擇該選項。



修改排序規則
如果是數據庫:ALTER DATABASE 數據庫名 COLLATE 排列規則
ALTER DATABASE test COLLATE Chinese_PRC_CI_AI

如果是表中的字段:ALTER TABLE 表名 ALTER COLUMN 字段名 數據類型(長度) COLLATE 排列規則
ALTER TABLE test ALTER COLUMN name varchar(10) COLLATE Chinese_PRC_CI_AI
*/


--所有排序規則
SELECT * FROM :: FN_HELPCOLLATIONS()




-----------------------------------------------------------------------------------
--1.為數據庫指定排序規則
CREATE DATABASE test1 COLLATE Chinese_PRC_CI_AS
GO

CREATE DATABASE test2 COLLATE Chinese_Hong_Kong_Stroke_90_CI_AI

GO

USE test1
go
CREATE TABLE a
(
col1 VARCHAR(10) ,
col2 VARCHAR(10)
)


INSERT INTO a
SELECT 'a1' , 'a2'
UNION ALL
SELECT 'a3' , 'a4'
GO

---------------

USE test2
go
CREATE TABLE a
(
col1 VARCHAR(10) ,
col2 VARCHAR(10)
)
GO
INSERT INTO a
SELECT 'a1' , 'a2'
UNION ALL
SELECT 'a5' , 'a6'


-----------------

SELECT * FROM test1.dbo.a

SELECT * FROM test2.dbo.a

--轉換規則,語句執行無錯
SELECT * FROM test1.dbo.a aa , test2.dbo.a bb
WHERE aa.col1 = bb.col1 COLLATE Chinese_PRC_CI_AS





SELECT * FROM test1.dbo.a aa , test2.dbo.a bb
WHERE aa.col1 = bb.col1 --這句單獨執行,出錯 ,無法解決 equal to 操作中 "Chinese_Hong_Kong_Stroke_90_CI_AI" 和 "Chinese_PRC_CI_AS" 之間的排序規則沖突。


--排序規則不一樣,無法比較字符串 ,字段,需要轉換規則.使其一致,好比2個人做比較,誰厲害點,指定一個規則,如這2個人sql方面做比較


USE master
go
DROP DATABASE test1
go
DROP DATABASE test2


-----------------------------------------------------------------------------------









--2.為表中的列指定排序規則
CREATE TABLE #t1
(
col1 VARCHAR(10) ,
col2 VARCHAR(10) COLLATE Chinese_PRC_CI_AS
)
GO

INSERT INTO #t1
SELECT 'a1' ,'a2'
UNION ALL
SELECT 'a3' ,'a4'

CREATE TABLE #t2
(
col1 VARCHAR(10) ,
col2 VARCHAR(10) COLLATE Chinese_Hong_Kong_Stroke_90_CI_AI
)
GO
INSERT INTO #t2
SELECT 'a1' ,'a2'
UNION ALL
SELECT 'a3' ,'a4'

SELECT * FROM #t1
SELECT * FROM #t2

--沒錯誤
SELECT * FROM #t1 aa JOIN #t2 bb ON aa.col1 = bb.col1

--轉換規則
SELECT * FROM #t1 aa , #t2 bb WHERE aa.col2 = bb.col2 COLLATE Chinese_PRC_CI_AS


SELECT *
FROM #t1 JOIN #t2 ON #t1.col2 = #t2.col2 --出錯,無法解決 equal to 操作中 "Chinese_Hong_Kong_Stroke_90_CI_AI" 和 "Chinese_PRC_CI_AS" 之間的排序規則沖突。


DROP TABLE #t1
DROP TABLE #t2

-----------------------------------------------------------------------------------


--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 '@a=@b'
ELSE '@a<>@b'
END
--結果:@a=@b

--使用排序規則 Chinese_PRC_BIN
SELECT CASE WHEN @a COLLATE Chinese_PRC_BIN = @b THEN '@a=@b'
ELSE '@a<>@b'
END
--結果:@a<>@b



SELECT @a
SELECT @b

--按筆畫姓氏查詢

SELECT * FROM TableName ORDER BY CustomerName COLLATE Chinese_PRC_Stroke_ci_as
-----------------------------------------------------------------------------------

本文轉自:http://www.cnblogs.com/qanholas/archive/2010/09/16/1828163.html

轉載于:https://www.cnblogs.com/rongxiaoya/archive/2013/03/20/2970916.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/181075.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息