是否有一种可移植的方法可以使用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>
答案 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 }