我正在将一些代码从某些版本的Sybase移植到PostgreSQL。这是一个使用Sybase客户端库的C应用程序。我的方法是编写一个转换层,以将调用转换dbsqlexec()
为PQexec()
(例如)。该部分大部分正常工作。
看来Sybase数据库是以区分大小写的方式(相对于数据库对象名称)设置的。例如,同时有一个WIDGET
表和一个widget
表。看起来此应用程序中的约定是:全大写名称表示实际数据表,而小写名称在运行某些处理时用作临时表。
根据4.1词法结构,“ 关键字和未加引号的标识符不区分大小写。 ”我知道我可以对标识符加双引号以禁用自动折叠为小写字母,但是我不想通过成千上万的行手动进行操作使用此数据库的代码。
有没有一种方法可以设置PostgreSQL以禁用数据库对象标识符的这种自动大小写折叠?
我的替代方法是编写一些代码,检查每个SQL语句,并在每个标识符(不是关键字)周围加上双引号。
关键词 可被用作标识符,如果用双引号-即使你不应该这样做。无论如何,您不能确定Sybase代码库中的某些标识符不是PostgreSQL中的关键字。所有其他原因都需要使用双引号或最好重命名标识符。
—
Erwin Brandstetter,2012年
实际上,postgres中未引用的标识符完全不区分大小写,它们被视为全部小写。因此tAbLeNaMe将匹配一个名为tablename的表,而不匹配一个名为tableName的表。我会重命名表,因为否则人们会忘记“,并最终被误访问的小写版本。
—
JamesRyan
@JamesRyan:错了。
—
a_horse_with_no_name
select * from TaBlEnAmE
将引用相同的表select * from tablename
或select * from TABLENAME
@a_horse_with_no_name:如果是
—
Mike Sherrill'Cat Recall'12
create table "tableName" (id integer primary key);
,create table "tablename" (id integer primary key);
则此查询select * from TaBlEnAmE;
将从“表名”中选择,而不是从“ tableName”中选择。“未加引号的名称总是折叠成小写”。