'.'的目的是什么? firebird 数据库查询中的运算符?

问题描述 投票:0回答:1

当我针对在 Windows 10 64 位 PC 上运行的 Firebird 数据库(版本 3.0.9)执行下面的 SQL 查询时。

SELECT * FROM AliasName WHERE AliasId=3. or 1=1--

我预计查询会因错误而失败,但奇怪的是 Firebird 执行查询没有任何问题并返回“AliasName”表中的所有三行

我在谷歌上搜索了“.”的用法。 Firebird 中的操作员,但找不到与我面临的问题相关的任何信息。

sql firebird firebird-3.0
1个回答
0
投票

点不是运算符,它是小数点分隔符。这是精确数字文字的 SQL 标准语法,Firebird 在此遵循该语法。引用自 ISO/IEC 9075-2:2016(“SQL 标准”):

<exact numeric literal> ::=
  <unsigned integer> [ <period> [ <unsigned integer> ] ]
  | <period> <unsigned integer>

此产生式规则使

3.
3
一样有效。换句话说,它允许您指定小数点,而无需在点后指定任何数字。

这也在Firebird 3.0语言参考中的Common Language Elements一节Number literals部分中指定:

格式 类型
... ...
<d>[<d> …​] "." [<d> …​]
NUMERIC(18, n) 其中 n 取决于小数点后的位数

不同之处在于,在 Firebird 中,字面量

3
被键入为
INTEGER
,而
3.
被键入为
BIGINT
(或
NUMERIC(18, 0)
,虽然在技术层面上,字面量没有得到正常用于
NUMERIC
的子类型,我认为这被认为是为了向后兼容而保留的历史错误)。

© www.soinside.com 2019 - 2024. All rights reserved.