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

标签 mysql sql syntax

语境

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

有一段时间一切都很好,但突然间我们开始看到某些表名的 SQL 语法错误。这个错误很容易修复:我们需要保护表名。

SQL 语法错误:

select * from 5e09c9c09e9ba0cceccb3701;

没有错误:

select * from `5e09c9c09e9ba0cceccb3701`;



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

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

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

最佳答案

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

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

Identifiers may begin with a digit but unless quoted may not consist solely of digits.



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

刚刚启动了一个本地 mysql 实例,模式似乎匹配:
  • 5e0x 不起作用
  • 5f0x 确实有效
  • 5eax 确实有效

  • 我会考虑将此作为错误提交,尽管这是一个低优先级的错误:)

    关于mysql - 为什么我需要在 MySQL 中引用表名 `5e09c9c09e9ba0cceccb3701`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59529563/

    相关文章:

    php - 通过从 MySQL 获取 id 将 $_SESSION ['name' ] 更改为 $_SESSION['id]

    mysql - SQL 查询从两个表中选择匹配和缺失的值

    php - 更新 session 用户的值?

    mysql - 我的表在性能方面的最佳结构 :

    python - 插入语法 SQL 的动态表 - Python

    java - JFrame 设置的简短编写方式

    linux - 何时/如何在测试中使用 "=="或 "-eq"运算符?

    php - php、ajax、json、jquery、mysql 中土耳其字符的 UTF-8 编码问题

    MySQL:计算获胜狂欢

    mysql - 为可维护性抽象 JOIN?