中文字段排序(MySQL与PostgreSQL)

在MySQL(5.5.8)与PostgreSQL(9.0)中建立相同的测试表、数据:

create table test_gbk_char(
id 
int,
username 
varchar(64)
);
insert into test_gbk_char values(1,'青霞'),(2,'曼玉'),(3,'楚红'); 

 

上述步骤完成之后,检查两者之间的字符集及其校验规则:

MySQL(在建表时我没有指定其校验规则及使用默认校验规则):

+--------------------------+-------------------------------------------------------+
| Variable_name            | Value                                                 |
+--------------------------+-------------------------------------------------------+
| character_set_client     | utf8                                                  |
| character_set_connection | utf8                                                  |
| character_set_database   | utf8                                                  |
| character_set_filesystem | binary                                                |
| character_set_results    | utf8                                                  |
| character_set_server     | utf8                                                  |
| character_set_system     | utf8                                                  |

----------------------------------------------------------------------------------------

| utf8     | UTF-8 Unicode               | utf8_general_ci     |      3 | 

 

PostgreSQL:

       ENCODING = 'UTF8'
       TABLESPACE 
= pg_default
       LC_COLLATE 
= 'Chinese (Simplified), Singapore' 

       LC_CTYPE   ='Chinese (Simplified), Singapore'


排序查询:

MySQL:

select * from test_gbk_char order by username;
2 曼玉
3 楚红
1 青霞
 

PostgreSQL:

select * from test_gbk_char order by username;
3;"楚红"
2;"曼玉"
1;"青霞"

 

从上面的结果可以看出PostgreSQL给出的结果是我想要的。那么造成这种差异的原因是什么呢?其实上文已经给出答案。主要是因为校验规则的不同。

utf8默认的校验规则是utf8_general_ci,它不会按照中文进行排序。如果想要mysql中的结果与PostgreSQL中的结果一样,有多种方法,比如修改表、字段字符集校验规则定义,如果不想修改表结构,可以在查询时进行转换:

 

select * from test_gbk_char order by CONVERT(username USING gbk) COLLATE gbk_chinese_ci;

 

3 楚红
2 曼玉
1 青霞
 

注:以上的对比查询只是为了说明不同字符校验对中文字段的影响,并不是说mysql与postgreSQL的排序异同。 

 

 

 

 参考:

http://ggsonic.iteye.com/blog/664921 

posted @ 2011-05-04 11:00  番茄侠  阅读(699)  评论(0编辑  收藏  举报