为何MySQL输入错误函数databese()时提示‘未选择数据库’?
MySQL拼写错误函数调用的错误提示差异原因分析
问题场景
执行拼写错误的查询语句:
select databese();
未选择数据库时,预期收到函数不存在的错误,却得到:
ERROR 1046 (3D000): No database selected
而选择数据库后,执行同一条错误语句,才得到预期的函数不存在错误:
ERROR 1305 (42000): FUNCTION hoge.databese does not exist
补充测试完整输出:
mysql> select databese(); ERROR 1046 (3D000): No database selected mysql> select database(); +------------+ | database() | +------------+ | NULL | +------------+ 1 row in set (0.00 sec) mysql> use hoge; Database changed mysql> select databese(); ERROR 1305 (42000): FUNCTION hoge.databese does not exist mysql> select database(); +---------------------------+ | database() | +---------------------------+ | hoge | +---------------------------+ 1 row in set (0.00 sec)
原因解析
这是MySQL的特定解析行为,和配置无关,核心在于SQL语句的解析优先级:
- 未选择默认数据库时:MySQL解析
databese()时,会先尝试将其识别为「表.列」的引用格式(因为没有默认库,函数调用的解析优先级低于表列引用检查)。由于此时没有选中任何数据库,无法完成表列引用的校验,直接抛出No database selected错误,根本不会进入函数存在性的校验流程。 - 已选择默认数据库时:MySQL会先检查当前库中是否存在名为
databese的自定义函数,确认不存在后,抛出函数不存在的1305错误。 - 正确的
database()是MySQL内置函数,它的解析优先级最高,无论是否选中数据库,都会被直接识别为内置函数,因此未选库时返回NULL,选库后返回当前数据库名称。
内容的提问来源于stack exchange,提问作者arubaito
相关产品推荐
相关产品推荐

