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
我已阅读 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