PostgreSQL 列名是不是区分大小写?

Posted

技术标签:

【中文标题】PostgreSQL 列名是不是区分大小写?【英文标题】:Are PostgreSQL column names case-sensitive?PostgreSQL 列名是否区分大小写? 【发布时间】:2014-01-19 15:56:01 【问题描述】:

我在 Postgres 中有一个 db 表说 persons,它是由另一个列名为 "first_Name" 的团队传下来的。现在我正在尝试使用 PG 指挥官来查询此表上的此列名。

select * from persons where first_Name="xyz";

它只是返回

错误:列“first_Name”不存在

不确定我是否在做一些愚蠢的事情,或者是否有解决此问题的方法?

【问题讨论】:

【参考方案1】:

标识符(包括列名)在 PostgreSQL 中被双引号折叠为小写。使用 双引号 创建并因此保留大写字母(和/或其他语法违规)的列名必须在其余生中使用双引号:

"first_Name"

(字符串文字/常量)用单引号括起来:

'xyz'

所以,是的,PostgreSQL 列名区分大小写(双引号时):

SELECT * FROM persons WHERE "first_Name" = 'xyz';

Read the manual on identifiers here.

我的一贯建议是只使用合法的小写名称,这样就不需要双引号了。

【讨论】:

@ArtB:SQL 标准定义了不区分大小写的标识符,就像 Postgres 实现它一样。唯一的偏差:未加引号的标识符在标准中被折叠为大写,但 pg 将所有没有双引号的东西都小写。 (仅在极少数情况下相关。)Details in the manual here. @adfs:我想我不能比我已经做过的更好地解释它了。更多信息,请点击我反复提供的手册的链接。 @adfs:在 SQL 中,foobarFOOBARFooBar 是同一个标识符。但是"foobar""FooBar""FOOBAR" 是不同的标识符 @a_horse_with_no_name 是的,但是在 SQL 下foobarFOOBAR"FOOBAR" 相同,在potgresql 下FOOBARfoobar 等与"foobar" 相同。跨度> @KamelMili:我建议将您的问题作为 question 提出,并提供所有必要的信息。评论不是地方。您始终可以链接到此答案以获取上下文。您可以在此处留下您的相关问题链接的评论(也可以引起我的注意)。【参考方案2】:

引用documentation:

关键字和不带引号的标识符不区分大小写。因此:

UPDATE MY_TABLE SET A = 5;

等价地可以写成:

uPDaTE my_TabLE SeT a = 5;

您也可以使用 带引号的标识符来编写它

UPDATE "my_table" SET "a" = 5;

引用标识符使其区分大小写,而未引用的名称始终折叠为小写(与未引用的名称折叠为大写的 SQL 标准不同)。例如标识符FOOfoo"foo"被PostgreSQL认为是相同的,但"Foo""FOO"与这三个不同并且彼此不同。

如果您想编写可移植的应用程序,建议您始终引用特定名称或永远不要引用它。

【讨论】:

【参考方案3】:

在 PostgresQL 中混合大小写或大写的列名必须用双引号引起来。所以最好的惯例是在所有小写字母后面加上下划线。

【讨论】:

根据@erwin-brandstetter 给出的解释,这是不正确的 这是怎么回事?如果您有混合大小写或大写的列名,为了引用它们,您需要将标识符放在双引号中。【参考方案4】:

如果使用 JPA,我建议更改为小写模式、表和列名,您可以使用下一个指令来帮助您:

select
    psat.schemaname,
    psat.relname,
    pa.attname,
    psat.relid
from
    pg_catalog.pg_stat_all_tables psat,
    pg_catalog.pg_attribute pa
where
    psat.relid = pa.attrelid

更改架构名称:

ALTER SCHEMA "XXXXX" RENAME TO xxxxx;

更改表名:

ALTER TABLE xxxxx."AAAAA" RENAME TO aaaaa;

更改列名:

ALTER TABLE xxxxx.aaaaa RENAME COLUMN "CCCCC" TO ccccc;

【讨论】:

【参考方案5】:

你可以试试这个例子,用大写字母命名表和列。 (postgresql)

//Sql;
      create table "Test"
        (
        "ID" integer,
        "NAME" varchar(255)
        )



//C#
  string sqlCommand = $@"create table ""TestTable"" (
                                ""ID"" integer GENERATED BY DEFAULT AS IDENTITY primary key, 
                                ""ExampleProperty"" boolean,
                                ""ColumnName"" varchar(255))";

【讨论】:

以上是关于PostgreSQL 列名是不是区分大小写?的主要内容,如果未能解决你的问题,请参考以下文章

请问mysql数据类型是不是区分大小写?

MySQL存储的字段是不区分大小写的,你知道吗?

如何查看mysql表名字段是不是区分大小写

SQL Server 列名区分大小写

mysql 存储过程区分大小写

数据库单元;混淆表/列名区分大小写