我已阅读https://www.postgresql.org/docs/9.6/static/sql-notify.html,频道名称仅被描述为“标识符”。
我正在使用NodeJS和pg https://www.npmjs.com/package/pg来访问postgres。
如果我在两者中使用小写字词,例如pg_notify('foo', ...
和LISTEN foo
可行。我测试了所有组合:
pg_notify LISTEN outcome
lower lower works
lower upper works
upper lower fails
upper upper fails
这是一个错误,还是作为'标识符'的逻辑结果? (如果是这样,是否应该在pg_notify页面上记录?)
答案 0 :(得分:4)
混淆来自引号。 单引号用于字符串,double用于标识符,如果不使用混合大小写/从数字/或其他技巧开始,则可以跳转到无。
运行pg_notify
函数时,将'foo'作为字符串参数传递,因此使用单引号,当您运行NOTIFY "Virtual"
时,使用Virtual
作为通道名称 - 标识符,所以你需要在这里使用"
。
所以,当你回答自己,改变
client.query("LISTEN 'Virtual'");
到
client.query('LISTEN "Virtual"');
解决了问题
https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
答案 1 :(得分:3)
您应该查找标识符定义:Identifiers and Key Words。
在这种意义上,不带引号的标识符不区分大小写,无论用户如何编写它们,Postgres都会将它们视为小写。在函数pg_notify()
中,第一个参数是不是一个标识符,而是一个文本文字,在没有解析的情况下被视为标识符,因此它不会转换为小写。