Postgred pg_notify /只有在通道名称小写的情况下才能工作

我读过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 

这是一个错误,还是作为一个“标识符”的逻辑结果? (如果是这样,是否应该logging在pg_notify页面上?)

混乱来自报价。 单引号用于string,double用于标识符,如果不使用混合大小写/从数字/或其他技巧开始,则可以将其忽略为空。

当你运行pg_notify函数时,你将'foo'作为stringparameter passing,因此使用单引号,当你运行NOTIFY "Virtual"你使用Virtual作为通道名称 – 一个标识符,所以你需要使用" here。

所以当你回答自己,改变

 client.query("LISTEN 'Virtual'"); 

 client.query('LISTEN "Virtual"'); 

修复了一个问题

https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS

您应该查找标识符定义: 标识符和关键字 。

没有引号的标识符在这种意义上不区分大小写,不pipe用户如何写,Postgres都将它们视为小写。 在函数pg_notify() ,第一个参数不是一个标识符,而是一个文本文字,在没有parsing的情况下被视为一个标识符,所以它不会被转换为小写。