我正在搜索正则表达式以验证字符串是否可以是有效的SQL列名称。
我想使用PCRE语法。
到目前为止,我发现了这一点
[\w-]+
但是我认为这还不够。我也见过/
(在SAP中)。
AFAIK规范是封闭源代码(您需要为此付费)。
从文档(Python re):
\ w 匹配Unicode单词字符;其中包括大多数可以是任何语言单词的一部分的字符,以及数字和 下划线。如果使用ASCII标志,则仅匹配[a-zA-Z0-9 _]。
正则表达式如何验证SQL列名?
该字符串应该可以像my_column
这样使用。
AFAIK保留字有效,因为您可以这样使用它们:
select * from my_table where "where" = 'here'
“ where”是列的名称。正则表达式不需要关心保留字。
答案 0 :(得分:3)
SQL标识符和关键字必须以字母(
a
-z
带变音符号的字母和非拉丁字母的字母)或下划线 (_
)。标识符或关键字中的后续字符可以是 字母,下划线,数字(0-9
)或美元符号($
)。注意 根据标识符的字母,不允许在符号中使用美元符号 SQL标准,因此它们的使用可能会使应用程序减少 便携式的。 SQL标准不会定义包含以下内容的关键字 数字或下划线开头或结尾,因此此标识符 表单可以避免与将来的扩展名冲突 标准。系统使用的标识符不超过
NAMEDATALEN
-1个字节; 较长的名称可以写在命令中,但是会被截断。 默认情况下,NAMEDATALEN
为64,因此最大标识符长度为63 个字节。如果此限制有问题,可以通过更改NAMEDATALEN
中的src/include/pg_config_manual.h
常量。
并且:
还有第二种标识符:带分隔符的标识符或 带引号的标识符。它是通过包围任意顺序的 双引号(
"
)中的字符。 [...]带引号的标识符可以包含任何字符,但该字符除外 代码为零。 (要包括双引号,请写两个双引号。) 这允许构造表或列名,否则 不可能,例如包含空格或“&”号的空格。的 长度限制仍然适用。
还有更多,您甚至可以使用转义的Unicode字符,例如:U&"d\0061t\+000061"
。阅读整章。
因此,一旦名称用双引号括起来,有效的标识符中允许使用除字符为零以外的任何字符的。如果没有双引号,则即使简单的字符串(例如“ select”)也恰好是reserved words,它们也可能无效。 (保留字的概念很不幸,由SQL标准设置,现在很难更改。)
您可以使用quote_ident()
让Postgres完成工作:
SELECT quote_ident('0of') = '0of';
仅在必要时添加报价。
表达式返回true
以获取有效的标识符。或者只是使用quote_ident('$identifier')
的结果来获得合法名称(在两种情况下都可以引用)。
答案 1 :(得分:2)
如果我们遵循PostgreSQL文档:
SQL标识符和关键字必须以字母(
的字母,不允许在标识符中使用美元符号。a
-z
,以及带变音符号和非拉丁字母的字母)或下划线(_
)开头。标识符或关键字中的后续字符可以是字母,下划线,数字(0
-9
)或美元符号($
)。请注意,根据SQL标准[...]
我们可以为这样的标识符编写正则表达式:
^([[:alpha:]_][[:alnum:]_]*|("[^"]*")+)$
正则表达式的第二个分支负责带引号的标识符。