sql - firebird 数据库查询中 '.' 运算符的用途是什么?

标签 sql firebird firebird-3.0

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

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

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

我在 Google 上搜索了“.”的用法Firebird 中的运算符,但找不到与我面临的问题相关的任何内容。

最佳答案

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

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

这个产生式规则使得 3.3 一样有效。换句话说,它允许您指定小数点,而无需指定点后的任何数字。这也不是 Firebird 特有的,大多数(如果不是全部)SQL 实现都应用此语法规则。

这也在 Number literals 部分中指定。 Firebird 3.0 语言引用中的公共(public)语言元素章节:

<表类=“s-表”> <标题> 格式 类型 <正文> ... ... <d>[<d> …​] "." [<d> …​] NUMERIC(18, n),其中 n 取决于小数点后的位数

不同之处在于 Firebird 中的文字 3输入为 INTEGER ,而3.输入为 BIGINT (或NUMERIC(18, 0))。

关于sql - firebird 数据库查询中 '.' 运算符的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75741289/

相关文章:

sql - 消除具有相反值的行

sql - 如何在 SQL 中搜索带有可选特殊字符的匹配项?

mysql - 当查询有 order by 子句时,复杂的 sql 运行速度极慢

python - 使用 pyodbc 连接到 Firebird 来绑定(bind)参数

Firebird:如何制作 md5 哈希?

linux - firebird3.0.service 的作业失败,因为超出了配置的资源限制

mysql - 模型中的错误检查

node.js - 嵌入式 Firebird 数据库

mysql - 如何将函数从 MySQL 转换为 Firebird?

sql - Firebird 中的 token 未知