在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