我在我们的应用程序中遇到了一个与 MySQL 表名相关的错误。我们的应用程序将表名生成为 24 位十六进制数字(即:)5e09c9c09e9ba0cceccb3701。
有一段时间一切都很好,但突然间我们开始看到某些表名的 SQL 语法错误。这个错误很容易修复:我们需要保护表名。
SQL 语法错误:
select * from 5e09c9c09e9ba0cceccb3701;
Run Code Online (Sandbox Code Playgroud)
没有错误:
select * from `5e09c9c09e9ba0cceccb3701`;
Run Code Online (Sandbox Code Playgroud)
为什么5e09需要保护以开头的表名?
我浏览了 MySQL 文档中的保留字或十六进制文字表示法,但我找不到对5e09SQL 语句中特殊解释的任何解释。
而且,如果有人知道,还有什么其他特殊前缀也可能会破坏 SQL 语句的语法?
我猜 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 实例,模式似乎匹配:
我会考虑将此作为错误提交,尽管这是一个低优先级的错误:)
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |