为什么需要在MySQL中引用表名`5e09c9c09e9ba0cceccb3701`?

时间:2019-12-30 10:50:07

标签: mysql sql syntax

上下文

我在我们的应用程序中遇到一个与MySQL表名有关的错误。我们的应用程序将表名生成为24个十六进制数字(即:5e09c9c09e9ba0cceccb3701)。

一切都进行了一段时间,但是突然之间,我们开始发现某些表名带有SQL语法错误。该错误很容易修复:我们需要保护表名。

SQL语法错误:

select * from 5e09c9c09e9ba0cceccb3701;

没有错误:

select * from `5e09c9c09e9ba0cceccb3701`;

问题

为什么要保护以5e09开头的表名?

我浏览了MySQL文档中的保留字或十六进制文字表示法,但是在SQL语句中找不到5e09特殊解释的任何解释。

而且,如果有人知道,其他什么特殊前缀也可能会破坏SQL语句的语法?

1 个答案:

答案 0 :(得分:5)

我猜想5E09被解析为一个数字(https://www.wolframalpha.com/input/?i=5E09),并且解析器在将这个数字与表名的其余部分(推测)串联时很费力,因为mysql允许表名以数字开头,但要求它不仅由数字组成。

参见https://dev.mysql.com/doc/refman/8.0/en/identifiers.html,引用:

  

标识符可以以数字开头,但除非引用不完全由数字组成。

换句话说,以[0-9] E [0-9]开头的所有表名都应显示相同的行为。

只需启动一个本地mysql实例,该模式似乎就可以匹配:

  • 5e0x不起作用
  • 5f0x确实有效
  • 5eax 确实有效

我认为这是一个bug,尽管它是低优先级的:)