портативный способ сортировки столбца по китайскому пиньину в рельсах - PullRequest
0 голосов
/ 10 февраля 2011

Существует ли переносимый способ сортировки столбцов в соответствии с китайским пиньинь (汉语拼音) в рельсах с использованием Activerecord или стандартного оператора SQL, независимо от базовой конфигурации базы данных.Если это невозможно, то каков рекомендуемый способ выполнить это на postgresql.

Здесь предоставляет подход для mysql базы данных с 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>

Ответы [ 2 ]

1 голос
/ 11 февраля 2011

Чтобы решить эту проблему, я только что написал гем toPinyin, просто gem install toPinyin

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

words.sort! {|a ,b|   a.pinyin.join <=> b.pinyin.join }
1 голос
/ 10 февраля 2011

Я собираюсь выйти на конечность и сказать: «Нет, не независимо от конфигурации базы данных с использованием SQL». Я не уверен, что контролирует сортировку Rails.

Порядок сортировки в системах управления базами данных SQL контролируется с помощью параметров сортировки. В зависимости от базы данных, вы можете установить параметры сортировки на уровне сервера, базы данных, таблицы или столбца. И, в зависимости от базы данных, вы можете даже указать параметры сортировки, которые будут использоваться во время выполнения в запросе.

Я почти уверен, что SQL Server поддерживает все эти уровни. PostgreSQL нет. Я не знаю о MySQL.

Чтобы отсортировать пиньинь, выберите подходящую сортировку. (Я не знаю, какой из них подходит.) Некоторые подробности находятся в разделе " Поддержка локалей ", а не в разделе "Сопоставление", в документации PostgreSQL.

Я не уверен, в какой степени ruby ​​полагается на что-либо из операционной системы - настройки локали, кодовые страницы, кодирование символов - для выполнения собственной сортировки. Но если он опирается на что-либо из ОС, я бы сказал, что он не на 100% надежен. (При этом разные реализации в разных операционных системах могут иметь несколько разные результаты.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...