是否有一种可移植的方法可以使用 Activerecord 或标准 SQL 语句根据 Rails 中的汉语拼音对列进行排序,而不管底层数据库配置如何。如果这是不可能的,那么在 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>
最佳答案
我要冒险说“不,无论使用 SQL 的数据库配置如何”。我不确定是什么控制 Rails 排序。
SQL 数据库管理系统中的排序顺序由排序规则控制。根据 dbms,您也许能够在服务器、数据库、表或列级别设置排序规则。而且,根据数据库管理系统的不同,您甚至可以指定在查询运行时使用的排序规则。
我非常确定 SQL Server 支持所有这些级别。 PostgreSQL 没有。我不了解 MySQL。
要对拼音进行排序,请选择适当的排序规则。 (我不知道哪一个合适。)一些详细信息位于 PostgreSQL 文档中的“Locale Support”下,而不是“排序规则”下。
我不确定 ruby 在多大程度上依赖操作系统中的任何内容(区域设置、代码页、字符编码)来进行自己的排序。但如果它依赖于操作系统中的任何东西,我不得不说它可能不是 100% 可靠。 (不同操作系统下的不同实现可能会产生略有不同的结果。)
关于mysql - Rails 中根据中文拼音对列进行排序的可移植方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4957857/