PostgreSQL可以创建区分大小写的数据库吗?


10

我正在将一些代码从某些版本的Sybase移植到PostgreSQL。这是一个使用Sybase客户端库的C应用程序。我的方法是编写一个转换层,以将调用转换dbsqlexec()PQexec()(例如)。该部分大部分正常工作。

看来Sybase数据库是以区分大小写的方式(相对于数据库对象名称)设置的。例如,同时有一个WIDGET表和一个widget表。看起来此应用程序中的约定是:全大写名称表示实际数据表,而小写名称在运行某些处理时用作临时表。

根据4.1词法结构,“ 关键字和未加引号的标识符不区分大小写。 ”我知道我可以对标识符加双引号以禁用自动折叠为小写字母,但是我不想通过成千上万的行手动进行操作使用此数据库的代码。

有没有一种方法可以设置PostgreSQL以禁用数据库对象标识符的这种自动大小写折叠?

我的替代方法是编写一些代码,检查每个SQL语句,并在每个标识符(不是关键字)周围加上双引号。


关键词 被用作标识符,如果用双引号-即使你不应该这样做。无论如何,您不能确定Sybase代码库中的某些标识符不是PostgreSQL中的关键字。所有其他原因都需要使用双引号或最好重命名标识符。
Erwin Brandstetter,2012年

实际上,postgres中未引用的标识符完全不区分大小写,它们被视为全部小写。因此tAbLeNaMe将匹配一个名为tablename的表,而不匹配一个名为tableName的表。我会重命名表,因为否则人们会忘记“,并最终被误访问的小写版本。
JamesRyan

@JamesRyan:错了。select * from TaBlEnAmE将引用相同的表select * from tablenameselect * from TABLENAME
a_horse_with_no_name

@a_horse_with_no_name:如果是create table "tableName" (id integer primary key);create table "tablename" (id integer primary key);则此查询select * from TaBlEnAmE;将从“表名”中选择,而不是从“ tableName”中选择。“未加引号的名称总是折叠成小写”
Mike Sherrill'Cat Recall'12

Answers:


3

我最后写了一些代码,将应用程序生成的SQL转换为PostgreSQL兼容的SQL。这很简单:

  • 将语句拆分为明智的标记,跳过单引号字符串文字
  • 用双引号括住任何非关键字或数字

我还利用了这一层将对的调用转换isnullcoalesce。到目前为止,它运行良好。


我使用引号(“blahblablah”),使其区分大小写..它工作顺利,我..
Anuj帕特尔

1

有没有一种方法可以设置PostgreSQL以禁用数据库对象标识符的这种自动大小写折叠?

不直接。您也许可以对PostgreSQL源代码进行相对较小的更改,然后重新编译它。(从src / backend / parser / parser.c开始?)但是如果它非常简单,我会感到惊讶。


我不想弄乱源代码,因为每次更改任何内容(主机,版本等)后,都需要对PostgreSQL安装进行自定义更改,并且二进制安装将不可用。
格雷格·休吉尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.