有没有一种可移植的方法来根据rails中的中文拼音(汉语拼音)使用Activerecord或标准SQL语句对列进行排序,而不管底层的数据库配置。如果这不可能,那么在postgresql上执行它推荐方法是什么?
Here为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>发布于 2011-02-11 17:53:07
为了解决这个问题,我刚刚编写了一个gem toPinyin,简称为gem install toPinyin。
require 'toPinyin'
words = "
检查
我们
的二
进制
是否
适合
你的
平台".split("\n")
words.sort! {|a ,b| a.pinyin.join <=> b.pinyin.join }发布于 2011-02-11 00:23:09
我将冒险说“不,不管使用SQL的数据库配置如何”。我不确定是什么控制了Rails排序。
SQL数据库管理系统中的排序顺序由排序规则控制。根据dbms的不同,您可以在服务器、数据库、表或列级别设置排序规则。而且,根据dbms的不同,您甚至可以指定运行时在查询中使用的排序规则。
我非常确定SQL Server支持所有这些级别。PostgreSQL不需要。我不知道MySQL怎么样。
要对拼音进行排序,请选择适当的排序规则。(我不知道哪一个合适。)在PostgreSQL文档中,一些细节在“Locale Support”下--而不是在“排序规则”下。
我不确定ruby在多大程度上依赖于操作系统的任何东西--区域设置、代码页、字符编码--来进行自己的排序。但如果它依赖于操作系统的任何东西,我不得不说它可能不是100%可靠的。(因为不同操作系统下的不同实现可能会产生略有不同的结果。)
https://stackoverflow.com/questions/4957857
复制相似问题