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的情况下被视为一个标识符,所以它不会被转换为小写。