便携式方式根据中文拼音在栏中对列进行排序

时间:2011-02-10 13:48:03

标签: mysql ruby-on-rails database postgresql cjk

是否有一种可移植的方法可以使用Activerecord或标准SQL语句在rails中根据中文拼音(汉语拼音)对列进行排序,而不管底层数据库配置如何。如果这不可能,建议在postgresql上执行它的方法。

Here为使用CHARSET的mysql数据库提供gb2312的方法。

    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>

2 个答案:

答案 0 :(得分:1)

我要走出困境并说“不,不管使用SQL的数据库配置如何”。我不确定是什么控制Rails排序。

SQL数据库管理系统中的排序顺序由排序规则控制。根据dbms,您可以在服务器,数据库,表或列级别设置排序规则。而且,根据dbms,您甚至可以指定在查询中运行时使用的排序规则。

我很确定SQL Server支持所有这些级别。 PostgreSQL没有。我不知道MySQL。

要对拼音进行排序,请选择合适的排序规则。 (我不知道哪一个是合适的。)一些细节在“Locale Support”下 - 而不是在“整理”下 - 在PostgreSQL文档中。

我不确定ruby在多大程度上依赖于操作系统中的任何内容 - 区域设置,代码页,字符编码 - 来进行自己的排序。但如果它依赖于操作系统的任何东西,我不得不说它可能不是100%可靠。 (因为不同操作系统下的不同实现可能会略有不同的结果。)

答案 1 :(得分:1)

要解决这个问题,我刚写了一个宝石toPinyin,只是gem install toPinyin

require 'toPinyin'
words = "
检查
我们
的二
进制
是否
适合
你的
平台".split("\n")

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