Postgres案例敏感性

Vik*_*iks 32 sql sql-server postgresql

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

select * from STD_TYPE_CODES
Run Code Online (Sandbox Code Playgroud)

我得到以下错误 -

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
Run Code Online (Sandbox Code Playgroud)

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

select * from "STD_TYPE_CODES"
Run Code Online (Sandbox Code Playgroud)

但是,由于我使用过MSSql Server,因此没有这样的问题.有没有办法摆脱这个?请帮忙.

Sas*_*sha 57

a_horse_with_no_name是对的.

在PostgreSQL中,不带引号的名称不区分大小写.因此SELECT * FROM hello而且SELECT * FROM HELLO是等价的.

但是,引用的名称区分大小写.SELECT * FROM "hello"不是等同于SELECT * FROM "HELLO".

为了使报价名称和不带引号的名称之间的"桥梁",不带引号的名称隐含小写,因此hello,HELLOHeLLo相当于"hello",而不是"HELLO""HeLLo"(OOPS!).

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


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

或者,尝试从MSSQL修改dump以使其"兼容PostgreSQL"(因此它将包含foos或"foo"s但不包含"FOO"s).

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

  • Re:"在PostgreSQL中,未加引号的名称不区分大小写",AFAIK实际上是在SQL标准中.但是,该标准表示不加引号的标识符应折叠为大写,但PostgreSQL将它们折叠为小写(可能是出于历史原因).只是一个小小的澄清. (23认同)