2011-02-10 4 views
0

기본 데이터베이스 구성에 관계없이 Active Record 또는 표준 SQL 문을 사용하여 중국어 병음 (汉语拼音)에 따라 열을 정렬 할 수있는 이식 방법이 있습니까? 이것이 가능하지 않다면 postgresql에서 수행하는 것이 좋습니다.레일에있는 중국어 병음에 따라 열을 정렬하는 편리한 방법

Heremysql CHARSET이 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> 

답변

1

이 문제를 해결하기 위해, 난 그냥 단순히 보석 toPinyin, gem install toPinyin

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

words.sort! {|a ,b| a.pinyin.join <=> b.pinyin.join } 
을 작성했습니다
1

나는 사지에 나가서 "아니오, SQL을 사용하는 데이터베이스 구성에 관계없이"라고 말할 것입니다. 레일즈 정렬을 제어하는 ​​것이 무엇인지 모르겠습니다.

SQL 데이터베이스 관리 시스템의 정렬 순서는 데이터 정렬에 의해 제어됩니다. dbms에 따라 서버, 데이터베이스, 테이블 또는 열 수준에서 데이터 정렬을 설정할 수 있습니다. 또한 dbms에 따라 쿼리에서 런타임에 사용할 데이터 정렬을 지정할 수도 있습니다.

저는 SQL Server가 모든 수준을 지원한다는 것을 확신합니다. PostgreSQL은 그렇지 않습니다. 나는 MySQL에 대해 모른다.

병음을 정렬하려면 적절한 데이터 정렬을 선택하십시오. (어떤 것이 적합한 지 모르겠습니다.) 자세한 내용 중 일부는 "Locale Support"- PostgreSQL 문서의 "데이터 정렬"아래에 있습니다.

루비는 로켈 설정, 코드 페이지, 문자 인코딩과 같은 운영 체제의 항목을 사용하여 자체 분류 작업을 수행 할 수 있습니다. 하지만 OS에 의존하는 것이라면 100 % 신뢰하지 못할 수도 있습니다. (다른 운영 체제에서 서로 다른 구현에서 약간 다른 결과가있을 수 있습니다.)

관련 문제