Postgres pg_notify/listen 仅在频道名称为小写时有效

Postgred pg_notify/listen only working if channel name is lower case

我已阅读 https://www.postgresql.org/docs/9.6/static/sql-notify.html,频道名称仅描述为 'identifier'。

我正在使用 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

这是一个错误,还是 'identifier' 的逻辑结果? (如果是这样,是否应该在 pg_notify 页上记录?)

您应该查找标识符定义:Identifiers and Key Words

从这个意义上讲,不带引号的标识符不区分大小写,无论用户如何编写它们,Postgres 都将它们视为小写。在函数 pg_notify() 中,第一个参数是 而不是 标识符,而是一个文本文字,它被视为标识符而不进行解析,因此不会转换为小写。

混淆来自引号。 单引号用于字符串,双引号用于标识符,如果您不使用 number/ 中的混合 case/start 或其他技巧,可以跳到 none。

当您 运行 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