在Postgres中转义类似关键字的列名
在Postgres中,有时候会遇到需要转义类似关键字的列名的情况。下面是解决这个问题的原因和方法。
为了安全起见,我们应该始终引用标识符。为此,必须使用带引号的标识符构建插入语句。
SQL 2003规定,带引号的标识符应该用双引号 " 引用,如果标识符中包含双引号,则必须重复双引号。以下是Java代码引用标识符的方法:
static String delimited_identifier (String identifier)
{
return "\"" + identifier.replaceAll ("\"", "\"\"") + "\"";
}
以下是构建插入语句的代码:
static String build_insert (String table, String[] columns)
{
StringBuilder sql = new StringBuilder ();
StringBuilder values = new StringBuilder ();
sql.append ("INSERT INTO ");
sql.append (delimited_identifier (table));
sql.append (" (");
int c = 0;
if (columns.length > 0) {
sql.append (delimited_identifier (columns[c]));
values.append ("?");
}
for (++c; c < columns.length; c++) {
sql.append (", ");
sql.append (delimited_identifier (columns[c]));
values.append (", ?");
}
sql.append (") VALUES (");
sql.append (values.toString ());
sql.append (")");
return sql.toString ();
}
示例:
String sql = build_insert ("Person", new String[]{"First name", "Last name"});
在这个问题中,没有必要区分两种情况。只需引用每个标识符即可。几乎不可能知道所有数据库的所有保留字。所以应该使用正确的字符引用,即双引号 ("")。MySQL通过使用反引号 (`) 违反了SQL标准。我的答案涵盖了正确的引号方式。
我不确定是否理解你的问题。你希望我将评论移到答案中吗?
如果将Java代码用于这个问题,不仅没有用,而且是可怕的...
在Postgres中,如果您没有在任何字段/列中提供引号,它默认会将其转换为小写。当涉及到列名时,Postgres会跳过检查关键字。
在您的情况下,我认为在列名中添加引号是没有必要的。
但是,如果您使用的是Postgres注册的关键字作为表名、模式名、函数名或触发器名等,您必须使用双引号,或者可以使用模式名和点连接。
假设order
是Postgres注册的关键字。在某些情况下,您必须使用这个关键字作为表名。
这时,Postgres允许您创建一个带有关键字的表。这就是Postgres的优点所在。
要访问order表,您可以使用双引号,或者在表名之前使用模式名。
例如:
1.
select * from schema_name.order;
2.
select * from "order";
同样,您可以使用这种组合方式。希望对您有所帮助。