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 中,foobar
、FOOBAR
和 FooBar
是同一个标识符。但是"foobar"
、"FooBar"
和"FOOBAR"
是不同的标识符
@a_horse_with_no_name 是的,但是在 SQL 下foobar
和FOOBAR
与"FOOBAR"
相同,在potgresql 下FOOBAR
和foobar
等与"foobar"
相同。跨度>
@KamelMili:我建议将您的问题作为 question 提出,并提供所有必要的信息。评论不是地方。您始终可以链接到此答案以获取上下文。您可以在此处留下您的相关问题链接的评论(也可以引起我的注意)。【参考方案2】:
引用documentation:
关键字和不带引号的标识符不区分大小写。因此:
UPDATE MY_TABLE SET A = 5;
等价地可以写成:
uPDaTE my_TabLE SeT a = 5;
您也可以使用 带引号的标识符来编写它:
UPDATE "my_table" SET "a" = 5;
引用标识符使其区分大小写,而未引用的名称始终折叠为小写(与未引用的名称折叠为大写的 SQL 标准不同)。例如标识符FOO
、foo
和"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 列名是不是区分大小写?的主要内容,如果未能解决你的问题,请参考以下文章