2011-02-10 47 views
0

中國拼音排序列有沒有列按中國拼音(漢語拼音)使用或者ActiveRecord的或標準的SQL語句軌,不管底層數據庫配置的排序可移植的方式。如果這是不可能的,推薦在postgresql上執行它的方式。移植的方式根據軌道

Here提供了一個使用CHARSET作爲gb2312的數據庫mysql的方法。

SQL code 

     mysql> create table t_cosler( 
      -> f_PY char primary key, 
      -> cBegin SMALLINT UNSIGNED not null, 
      -> cEnd SMALLINT UNSIGNED not null ->); 
     Query OK, 0 rows affected (0.09 sec) 

     mysql> insert into t_cosler values 
     -> ('A',0xB0A1,0xB0C4), 
     -> ('B',0xB0C5,0xB2C0), 
     -> ('C',0xB2C1,0xB4ED), 
     -> ('D',0xB4EE,0xB6E9), 
     -> ('E',0xB6EA,0xB7A1), 
     -> ('F',0xB7A2,0xB8C0), 
     -> ('G',0xB8C1,0xB9FD), 
     -> ('H',0xB9FE,0xBBF6), 
     -> ('J',0xBBF7,0xBFA5), 
     -> ('K',0xBFA6,0xC0AB), 
     -> ('L',0xC0AC,0xC2E7), 
     -> ('M',0xC2E8,0xC4C2), 
     -> ('N',0xC4C3,0xC5B5), 
     -> ('O',0xC5B6,0xC5BD), 
     -> ('P',0xC5BE,0xC6D9), 
     -> ('Q',0xC6DA,0xC8BA), 
     -> ('R',0xC8BB,0xC8F5), 
     -> ('S',0xC8F6,0xCBF9), 
     -> ('T',0xCBFA,0xCDD9), 
     -> ('W',0xCDDA,0xCEF3), 
     -> ('X',0xCEF4,0xD188), 
     -> ('Y',0xD1B9,0xD4D0), 
     -> ('Z',0xD4D1,0xD7F9); 

     Query OK, 23 rows affected (0.16 sec) Records: 23 Duplicates: 0 Warnings: 0 
     mysql> select * from o_personnel; 
     +------+------------+ 
     | A_Id | A_UserName | 
     +------+------------+ 
     | 1 | 首先 | 
     | 2 | 檢查 | 
     | 3 | 我們 | 
     | 4 | 的二 | 
     | 5 | 進制 | 
     | 6 | 是否 | 
     | 7 | 適合 | 
     | 8 | 你的 | 
     | 9 | 平臺 | 

     +------+------------+ 9 rows in set (0.00 sec) 
    mysql> select p.*,c.* 
    -> from o_personnel p , t_cosler c 
    -> where CONV(HEX(left(A_UserName,1)),16,10) between c.cBegin and c.cEnd; 

+------+------------+------+--------+-------+ 
| A_Id | A_UserName | f_PY | cBegin | cEnd | 
+------+------------+------+--------+-------+ 
| 4 | 的二  | D | 46318 | 46825 | 
| 2 | 檢查  | J | 48119 | 49061 | 
| 5 | 進制  | J | 48119 | 49061 | 
| 8 | 你的  | N | 50371 | 50613 | 
| 9 | 平臺  | P | 50622 | 50905 | 
| 1 | 首先  | S | 51446 | 52217 | 
| 6 | 是否  | S | 51446 | 52217 | 
| 7 | 適合  | S | 51446 | 52217 | 
| 3 | 我們  | W | 52698 | 52979 | 
+------+------------+------+--------+-------+ 
9 rows in set (0.00 sec) 

mysql> 

回答

1

爲了解決這個問題,我剛纔寫的瑰寶toPinyin,只需gem install toPinyin

require 'toPinyin' 
words = " 
檢查 
我們 
的二 
進制 
是否 
適合 
你的 
平臺".split("\n") 

words.sort! {|a ,b| a.pinyin.join <=> b.pinyin.join } 
1

我打算出去走一走,說「不,不管使用SQL的數據庫配置如何」。我不知道什麼控制Rails排序。

SQL數據庫管理系統中的排序順序由歸類控制。根據dbms,您可以在服務器,數據庫,表或列級別設置排序規則。並且,根據dbms,您甚至可以指定在查詢中運行時使用的排序規則。

我很確定SQL Server支持所有這些級別。 PostgreSQL不會。我不知道MySQL。

要對拼音進行排序,請選擇適當的排序規則。 (我不知道哪一個是合適的。)一些細節在「Locale Support」之下 - 不在「整理」下 - 在PostgreSQL文檔中。

我不知道到Ruby依賴於從操作系統什麼什麼程度 - 區域設置,代碼頁,字符編碼 - 做自己的排序。但是,如果它依賴於從OS什麼,我不得不說,它可能不是100%可靠。 (在不同操作系統下,不同的實現可能會稍有不同的結果。)