上下文
我在我们的应用程序中遇到了一个与MySQL表名相关的bug。我们的应用程序以24十六进制数字(即:5e09c9c09e9ba0cceccb3701)的形式生成表名。
一切都进行了一段时间,但突然间,我们开始看到带有特定表名的SQL语法错误。这个bug很容易修复:我们需要保护表名。
SQL语法错误:
select * from 5e09c9c09e9ba0cceccb3701;无错误:
select * from `5e09c9c09e9ba0cceccb3701`;问题
为什么需要保护以5e09开头的表名?
我查看了保留字或十六进制文字表示法的MySQL文档,但在SQL语句中找不到对5e09的特殊解释的任何解释。
而且,如果有人知道,还有什么其他特殊前缀也可能破坏SQL语句的语法?
发布于 2019-12-30 10:57:11
我猜想5E09被解析为一个数字(https://www.wolframalpha.com/input/?i=5E09),解析器很难将这个数字与表名的其余部分连接起来(推测),因为mysql允许以数字开头的表名,但要求它不只是由数字组成。
参见https://dev.mysql.com/doc/refman/8.0/en/identifiers.html,引用:
标识符可以以数字开头,但除非引用,否则不能仅由数字组成。
换句话说,所有以0-9E0-9开头的表名都应该显示相同的行为。
刚刚构造了一个本地mysql实例,该模式似乎与之匹配:
我会认为这是一个错误,尽管这是一个低优先级的错误:)
https://stackoverflow.com/questions/59529563
复制相似问题