【问题标题】:Postgresql and oracle with greater than operator behaviour具有大于运算符行为的 Postgresql 和 oracle
【发布时间】:2015-09-21 22:20:24
【问题描述】:

我有一个名为 names 的表,其中包含数据库条目 RmRMRnashRmash。此外,我正在使用 PostgreSQL 9.1 和 Oracle 11。

在 Oracle 中如下查询

select *
from names
  where name > 'Rm'         

返回 RnashRmash。但是在 PostgreSQL 中,相同的查询返回 RMRMM的ASCII值小于Rm中的m

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

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

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

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

感谢您提前提供的帮助。

【问题讨论】:

  • @rbaleksandar 编辑中的所有粗体字是怎么回事?这不是很有帮助。
  • 如果您愿意,您可以将其反转。大多数情况下,它只是替换以前使用但不那么可见的引号。我已经强调了基本术语。每个句子都包含“Rm”、“M”或类似词,这不是我的错。 :D 现在您只需(主要)查看粗体文本即可获得重要信息。

标签: oracle postgresql collation


【解决方案1】:

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

检查数据库上的LC_COLLATE 设置。在psqlSHOW lc_collate; 中查看\l+ mydatabase

如果您想单独按字符序数排序,而不应用国家语言排序规则,请使用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"

【讨论】:

  • select * from names where name > 'Rm' COLLATE "C" 给出关于 COLLATE 的错误。 Show lc_collat​​e 将值显示为“美国英语”。我对更改表或列有限制。该表可能来自第三方。
  • @learnern07 您使用的是旧的 PostgreSQL 版本吗? SELECT version() 请。也显示准确的错误消息文本。最后,您使用的是什么操作系统?
  • 现在上面给出的查询返回 'Rnash' 和 'Rmash' 与 Oracle 输出相同。谢谢你。正如您之前提到的,我的语言环境的排序规则指定不区分大小写的排序。如何通过查看哪些排序规则信息知道?
  • @learnern07 这取决于操作系统的排序规则实现,所以不幸的是没有简单的方法可以做到这一点。
猜你喜欢
  • 2018-12-25
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
  • 2011-05-04
  • 2012-10-13
  • 2015-10-18
相关资源
最近更新 更多