1. 程式人生 > >sql collate 子句 排序規則

sql collate 子句 排序規則

排序規則沖突 數據庫排序 服務器 color data 麻煩 varchar 建議 style

SQL SERVER的排序規則平時使用不是很多,也許不少初學者還比較陌生,但有
一個錯誤大家應是經常碰到: SQL SERVER數據庫,在跨庫多表連接查詢時,若兩數據
庫默認字符集不同,系統就會返回這樣的錯誤:

“無法解決 equal to 操作的排序規則沖突。”

COLLATE 是一個子句,可應用於數據庫定義或列定義以定義排序規則,或應用於字符串表達式以應用排序規則轉換。

語法

COLLATE { <collation_name> | database_default }
<collation_name> :: = 
     { Windows_collation_name } | { SQL_collation_name }

collation_name 應用於表達式、列定義或數據庫定義的排序規則的名稱。

database_default 使 COLLATE 子句繼承當前數據庫的排序規則。

一.錯誤分析:
  這個錯誤是因為排序規則不一致造成的,我們做個測試,比如:

create table #t1(
name varchar(20) collate Albanian_CI_AI_WS,  
value int)

create table #t2(
name varchar(20) collate Chinese_PRC_CI_AI_WS,    
value int )

表建好後,執行連接查詢:

select * from #t1 A inner join #t2 B on A.name=B.name

這樣,錯誤就出現了:

服務器: 消息 446,級別 16,狀態 9,行 1
無法解決 equal to 操作的排序規則沖突。

要排除這個錯誤,最簡單方法是,表連接時指定它的排序規則,這樣錯誤就
不再出現了。語句這樣寫:

select * from #t1 A inner join #t2 B on A.name collate database_default=B.name collate database_default 
select
* from #t1 A inner join #t2 B on A.name =B.name collate database_default

語法規則 字段名後跟 collate database_default 建議用 collate database_default 這樣的話 繼承自 當前數據庫排序規則 避免後續有不必要的麻煩

sql collate 子句 排序規則