close
資料庫的定序真的是一個被嚴重忽視的東西,
NT星球裡大部份人都知道要幫客戶的資料庫設定什麼定序
才不會讓這客戶在接下來的幾小時,甚至幾天內都哇哇叫個不停
不過,除了隱約記得它是資料庫裡字元集的排列方式這種沒人懂的說明外
我們還真的不太知道它是什麼
 
我相信這個情況並不止在NT星球發生
當課堂上到這一個部份時,大部份的同學表情木然,絲毫沒有受到一點感動
老師更沒有突然間HIGH起來
只有我,急忙把正在用來玩GAME的手機往旁邊一丟(歹勢啦)
瘋狂地在講義上抄下所有說明和範例
 
然後在下一個章節時又撿回手機繼續玩......
 
總之,我們來看什麼是定序。
先來看個簡單的資料表格
Customers資料表格裡有city欄位,當我們SELECT這個表格,下了ORDER BY city時
01
 
回傳的結果裡台北排在前面,彰化的彰因為筆劃最多所以排最後
一切看起來合情合理,天經地義
但事情並沒有如此單純,會以這種方式排列,只是因為SQL Server在台灣地區的預設定序是 Chinese_Taiwan_Stroke_CI_AS
 
啊不照筆劃排要用什麼排?
有趣就在這裡了,如果我們下了一個SELECT語法強制它用另一種定序的排列法傳回
我們看到的結果就會不同了
02
你發現雲林被排在最後了嗎?(沒發現?你眼睛要去檢查一下了!!)
 
SELECT customerid,city FROM dbo.Customers
ORDER BY city COLLATE Chinese_Taiwan_BOPOMOFO_CI_AI
在SELECT語法後面加上 COLLATE Chinese_Taiwan_BOPOMOFO_CI_AI 之後
就可以用指定的定序傳回資料
那這個BOPOMOFO又是什麼玩意兒?念念看......
(我想你現在的表情一定很可愛)
ㄅ...ㄆ...ㄇ...ㄈ...
 
所以在這種排列法下,雲林在最後面(你又猶豫了,注音符號沒學好厚?!)
 
什麼是定序:決定資料庫所使用的字元集、排序的方式
這句話,好像熊熊就給它懂了
 
前陣子我的一些資料表函數就出了一些包,
客戶的SQL Server是英文版本,資料表函數這些暫存TABLE以Server的預設定序排列
而在建立資料庫時,我們又強制指定它採用Chinese_Taiwan_Stroke_CI_AS(非預設)
所以二個不同定序的表格要相互引用時,就發生了完全比對不起來的Error
 
我當時自然沒有如此心平氣和,在說了二百句"什麼鬼"之後
才在Google老師那裡找到原因和解法,
請慶大一一修改Function內容,強制指定回傳的定序才算解決
由於這個慘痛的經驗,我在課堂上沒有突然跳起來就已經算是很收斂了
 
另一個不喜歡定序的原因是名字太難記了,
從一台機器上看了定序設定,然後走到另一台Server也要照著設時,還沒看過有那幾個人可以記清楚的
不過,原來定序名稱的每一個部份都有其意義
[Chinese_Taiwan_Stroke]_CS_AS_WS
 
[SortRules] 用來識別指定字典排序時套用排序規則之字母或語言的字串。例如 Latin1_General 或Chinese_Taiwan_Stroke 。
Case Sensitivity    CI 指定不區分大小寫,CS 指定區分大小寫
Accent Sensitivity  AI 指定不區分腔調字,AS 指定區分腔調字(通常用在歐洲語系,如法文)
Kana Sensitivity    KS 指定區分假名(用在日文)
Width Sensitivity   WS 指定區分全半形,不寫就表示不區分
 
BIN 指定要用的二進位排序順序,通常是區分大小寫、全半形。
例:_CS_AS_WS   區分大小寫、區分腔調字、區分全半形
 
 
這時候又要想起背後靈的那句話......"一堂再無聊的課,只要有學到一點點東西,這堂課就上得值得了。"
不過,這整套課程的第一階段入門篇已經結束了
從這個星期開始,我不但每次都得扛著重重的原文書去上課
課程內容更是充實到讓我從頭到尾狂抄筆記
最猛的是,原本三次的下課休息時間減少到一次,老師還切切叮嚀不可遲到
為了保持清醒,我甚至懷疑我的血管裡流的應該是咖啡而不是血液......
 
太扯了~~
總之先預告一下,最近在一個很忙的狀態,網誌又要停很久
再花時間寫網誌,我可能得拉著小麥麥一起去跳樓了
(不過我應該會把他丟下去之後才決定自己還是不要跳)
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Agnes 的頭像
    Agnes

    Agnes的部落格

    Agnes 發表在 痞客邦 留言(7) 人氣()