看起来 postgres 将字符串'now()'
视为对函数的调用now()
。
为什么 postgres 允许这样做?
select 'now'::timestamp;
或这个?
select 'now()'::timestamp;
甚至这个?
select ' ( ( ))) now)('::timestamp;
它不会对其他函数(例如clock_timestamp()
.
看起来 postgres 将字符串'now()'
视为对函数的调用now()
。
为什么 postgres 允许这样做?
select 'now'::timestamp;
或这个?
select 'now()'::timestamp;
甚至这个?
select ' ( ( ))) now)('::timestamp;
它不会对其他函数(例如clock_timestamp()
.
'now'
(具有任意数量的前导和尾随空格以及方括号({[( )]}
,被修剪为噪声)是一个特殊的日期/时间输入常量。它计算为当前事务的时间戳。如果你觉得这很奇怪,你应该尝试
SELECT 'allballs'::time;
一下。:)now()
另一方面,(没有单引号,并且恰好有一对尾括号)是一个函数,在执行时评估。两者恰好使用相同的英语单词,因为它们返回“当前时间”。但两者本质上有很大不同。
当您使用其中任何一个作为列默认值时,差异就会变得明显。第一个巩固了设置列默认值的事务的时间戳。第二个计算动态插入新行的事务的时间戳。(通常,您需要第二个。)
看: