Postgresql和oracle具有大于运算符的行为

时间:2015-09-21 22:20:24

标签: oracle postgresql collation

我有一个名为names的表,数据库条目 Rm RM Rnash Rmash 。另外我使用的是PostgreSQL 9.1和Oracle 11。

在Oracle中使用以下查询

select *
from names
  where name > 'Rm'         

返回 Rnash Rmash 。但是在PostgreSQL中,相同的查询返回 RM RM 中的 M 的ASCII值小于 m Rm

问题1:为什么PostgreSQL查询返回 RM ? Oracle和PostgreSQL都是区分大小写的数据库。

我的猜测是,它可能是由于PostgreSQL中的COLLATE不匹配造成的。

问题2:如何找到与PostgreSQL和Oracle相关的COLLATE信息?

问题3:如何使PostgreSQL查询的输出与Oracle相同?

感谢您在Advance中的帮助。

1 个答案:

答案 0 :(得分:0)

这是因为您的语言环境的排序规则指定了不区分大小写的排序。

检查数据库中的LC_COLLATE设置。查看\l+ mydatabasepsql中的SHOW lc_collate;

如果您想单独对字符序号进行排序,而未应用国家/地区语言排序规则,请使用COLLATE "C",例如

select *
from names
where name > 'Rm' COLLATE "C"

如果您希望对所有操作使用“哑”字符序数排序,则需要使用选项LC_COLLATE "C"CREATE DATABASE重新创建数据库。这将涉及转储和重新加载。

您可以改为ALTER TABLE ... ALTER COLUMN mycolumn TYPE thesametype COLLATE "C"来更改特定列的默认排序规则。保持类型与之前相同,只需附加COLLATE "C"