我有一个名为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中的帮助。
答案 0 :(得分:0)
这是因为您的语言环境的排序规则指定了不区分大小写的排序。
检查数据库中的LC_COLLATE
设置。查看\l+ mydatabase
或psql
中的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"
。