您的位置:首页 > 数据库 > MySQL

中文字段排序(MySQL与PostgreSQL)

2011-05-04 11:00 274 查看
在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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: