Postgres大小写敏感性

64

我已经通过工具从MSSql Server 2008导入了100个表到Postgres中,该工具将所有表及其列都创建为 大写字母。现在,如果我想从表中创建数据视图,例如:STD_TYPE_CODES,应该怎么做?

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,所以没有出现这种问题。那么有什么办法可以摆脱这个问题吗?请帮忙。


9
只需创建视图和表而不用引用它们。手册中相关的部分在这里:http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS,示例在这里:http://sqlfiddle.com/#!15/947c3/1 - user330315
4
这是一个有趣的讨论,涉及到跨数据库的命名标识符和大小写敏感性问题。链接为:http://www.alberton.info/dbms_identifiers_and_case_sensitivity.html#.Uv9tWGRDs00。 - Gordon Linoff
1个回答

120
在PostgreSQL中,未使用引号的名称不区分大小写。因此 SELECT * FROM helloSELECT * FROM HELLO 是等效的。
然而,使用引号的名称区分大小写。 SELECT * FROM "hello" 不等同于 SELECT * FROM "HELLO"
为了将带引号的名称与不带引号的名称建立“桥梁”,未加引号的名称会被自动转换为小写,因此 hello HELLO HeLLo 等价于 "hello" ,但不等同于 "HELLO" "HeLLo" (糟糕!)。
因此,在 PostgreSQL 中创建实体(表、视图、过程等)时,应将它们指定为未加引号或已加引号但小写的形式。
要转换现有的表/视图/等,可以使用类似于 ALTER TABLE "FOO" RENAME TO "foo" 的命令。
或者,尝试修改来自 MSSQL 的转储文件,使其“兼容” PostgreSQL(因此它将包含 foo "foo",但不包含 "FOO" )。
要实现这一点,可以通过以下两种方式之一完成:
  • 显式编辑转储文件。(如果您使用的是 Linux,则可以使用 sed -r' s /"[^"]+ "/\ L \ 0 / g' dumpfile 命令。但请注意,此命令也可能修改字符串常量中的文本。)
  • 或者在从 MSSQL 获取转储时指定某些选项。(我不确定 MSSQL 中是否有此类选项,从未使用过它,但很可能存在这样的选项。)

  • 42
    关于“在PostgreSQL中,非引号名称是不区分大小写的”,据我所知,这实际上是符合SQL标准的。然而,该标准规定非引号标识符应折叠为大写字母,但PostgreSQL将它们折叠为小写字母(可能是出于历史原因)。只是一个小澄清。 - mu is too short
    1
    这个在服务器端可配置吗? - Muhammad Gelbana
    1
    @MuhammadGelbana,您具体指的是什么?如果您在谈论将PostgreSQL配置为将未引用的名称转换为大写而不是小写,则很遗憾,我认为没有这个选项(至少,在相应的文档页面中我没有看到相关提及)。 - Sasha
    1
    @RobertHarvey,我想向a_horse_with_no_name致敬,因为他实际上是第一个给出正确(且简洁)答案的人。或者从答案到评论的引用不被推荐吗? - Sasha
    1
    Not in answers. - Robert Harvey

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接