【问题标题】:Postgres Case SensitivityPostgres 区分大小写
【发布时间】:2014-03-14 19:44:42
【问题描述】:

我通过工具从 MSSql 服务器 2008 中导入了 100 个 Postgres 表,该工具创建了所有表以及它们在大写字母中的列。现在,如果我想从表中创建数据视图,例如 - STD_TYPE_CODES as-

select * from STD_TYPE_CODES

我收到以下错误-

ERROR:  relation "std_type_codes" does not exist
LINE 1: select * from STD_TYPE_CODES
                  ^
********** Error **********
ERROR: relation "std_type_codes" does not exist
SQL state: 42P01
Character: 15

我知道我可以在表名周围加上引号-

select * from "STD_TYPE_CODES"

但由于我使用过 MSSql Server,所以不存在此类问题。 那么有什么办法可以摆脱这种情况吗?请帮忙。

【问题讨论】:

标签: sql sql-server postgresql


【解决方案1】:

在 PostgreSQL 中,未加引号的名称不区分大小写。因此SELECT * FROM helloSELECT * FROM HELLO 是等价的。

但是,带引号的名称是区分大小写的。 SELECT * FROM "hello"等同于SELECT * FROM "HELLO"

为了在带引号的名称和不带引号的名称之间建立“桥梁”,不带引号的名称隐式小写,因此helloHELLOHeLLo 等效于 "hello",但不等于 "HELLO" 或 @987654331 @(哎呀!)。

因此,在 PostgreSQL 中创建实体(表、视图、过程等)时,您应该将它们指定为不带引号或带引号但小写。


要转换现有的表/视图/等,您可以使用 ALTER TABLE "FOO" RENAME TO "foo" 之类的东西。

或者,尝试从 MSSQL 修改转储以使其“与 PostgreSQL 兼容”(使其包含 foos 或 "foo"s 但不包含 "FOO"s)。

  • 通过显式编辑转储文件。 (如果您使用的是 Linux,则可以使用 sed -r 's/"[^"]+"/\L\0/g' dumpfile — 但请注意,此命令也可能会修改字符串文字中的文本。)
  • 或者在从 MSSQL 获取转储时指定一些选项。 (我不确定MSSQL中是否有这样的选项,从未使用过,但可能应该存在这样的选项。)

【讨论】:

  • 回复:“在 PostgreSQL 中,不带引号的名称不区分大小写”,AFAIK 实际上是在 SQL 标准中。然而,该标准规定不带引号的标识符应该折叠为大写,但 PostgreSQL 将它们折叠为小写(可能出于历史原因)。只是一个小的澄清。
  • 这可以在服务器端配置吗?
  • @MuhammadGelbana,到底是什么?如果您正在谈论将 PostgreSQL 配置为大写不带引号的名称而不是小写它们的可能性,那么我认为,遗憾的是,没有(至少,我在相应的文档页面中没有提到这一点)。
  • @RobertHarvey,我想向 a_horse_with_no_name 致敬他的comment,因为他实际上是第一个给出正确(简洁)答案的人。还是不推荐从 cmets 的答案中引用?
  • 不在答案中。
猜你喜欢
  • 2015-07-05
  • 2014-03-25
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
  • 2016-12-24
  • 2015-02-22
  • 2021-10-19
相关资源
最近更新 更多