【问题标题】: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”不存在

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

【问题讨论】:

    标签: sql postgresql identifier case-sensitive case-insensitive


    【解决方案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))";
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-22
          • 1970-01-01
          • 2011-01-01
          • 2012-07-03
          相关资源
          最近更新 更多