UTF-8 正體中文 (繁體) 的筆畫排序

好像很久以前, 就已經發現到, 中文的排序是有一些問題的, 但我就放著。直到昨天在處理某個頁面時, 我發現, glossary 之類的東西, 按照筆畫排序是很重要的, 所以就 Google 了一下。

一開始, 我以為是 postgresql locale 的問題, 找到了幾個 link, 但是都沒有下文, 而且重點是我一開始在 Ubuntu 裝 postgresql 的時候, 我沒有更改設定, 所以 zh_TW 並沒有進去。開了台新機器隨便測一測, 仍然沒有達到我想要的結果。

直到我赫然發現我整個方向都錯了。後來才發現, 字元編碼本身, UTF-8 並不是按照筆畫順序排的, 但 Big5 是, 所以可以把該欄位轉成 Big5 之後再用這個欄位排序。

以下可以找到很多 MySQL 的版本:

以下是 postgresql 的 sample code。一般來說, 原本的搜尋就是像下面這樣:

db=# select id, title from kb_article order by title;
id | title
-----+------------------------------------------
158 | 丁種建築用地
80 | 不動產奢侈稅可用公告現值並扣成本嗎
78 | 不動產奢侈稅的課徵時點為何
79 | 不動產的奢侈稅稅率為何
157 | 丙種建築用地
179 | 主建物
161 | 乙種工業用地
156 | 乙種建築用地
214 | 事故屋
33 | 交屋注意事項
12 | 交易安全機制
116 | 什麼是區段化、去識別化方式提供查詢

從上面可以看到, 乙只有一劃, 但是他並沒有排在最前面。

db=# select id, title from kb_article order by convert_to(title, 'BIG5');
id | title
-----+------------------------------------------
42 | 「銷售契約」是指公契還是私契
161 | 乙種工業用地
156 | 乙種建築用地
158 | 丁種建築用地
34 | 入住前準備事宜
175 | 土地改良物
153 | 土地使用分區
152 | 土地持份
94 | 土地相關
44 | 土地重劃後之「持有期間」如何計算
191 | 大公
220 | 女兒牆
192 | 小公
79 | 不動產的奢侈稅稅率為何
80 | 不動產奢侈稅可用公告現值並扣成本嗎
78 | 不動產奢侈稅的課徵時點為何
116 | 什麼是區段化、去識別化方式提供查詢

沒想到… 這年頭… BIG5 還有這個作用 orz, 不過在 django 裡頭就只能下 raw 不能直接用他的 ORM 啦!