francs=> select * From tbl_area order by name; id | name --------+------------ 0118 | 乌兰察布 0100 | 呼和浩特 011800 | 四王子旗 011700 | 武川县 011600 | 清水河县 000002 | 澳门 011200 | 苏尼特右旗 011300 | 苏尼特左旗 012000 | 集宁区 000001 | 香港 (10 rows)
备注:根据中文字段 name 排序的结果不是我们想要的,参考 bbs 帖子,可以使用 convert_to ()函数转换成目标编码的 bytea 形式解决.
方法一: 使用 Convert_to 函数
2.1 convert_to 函数
1 2 3 4 5 6 7 8 9 10 11 12
francs=> /df convert_to List of functions Schema | Name | Result data type | Argument data types | Type ------------+------------+------------------+---------------------+-------- pg_catalog | convert_to | bytea | text, name | normal (1 row) francs=> select convert_to('香港','gbk'); convert_to ------------ xcfe3b8db (1 row
备注:输出为二进制形式。
2.2 根据 convert_to() 函数输出排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14
francs=> select * From tbl_area order by convert_to(name,'gbk'); id | name --------+------------ 000002 | 澳门 0100 | 呼和浩特 012000 | 集宁区 011600 | 清水河县 011800 | 四王子旗 011200 | 苏尼特右旗 011300 | 苏尼特左旗 0118 | 乌兰察布 011700 | 武川县 000001 | 香港 (10 rows)
备注:使用 convert_to() 函数转换后得到了想要的结果。
方法二: 排序时指定字段的 Collate
由于创建数据库后不支持更改数据库的 LC_COLLATE (排序规则),但在 order by 时可以指定字段的 Collate 属性,如下: