MySQL 8.0普通用户执行SHOW COLUMNS返回0行的问题求助
问题原因及解决方案
可能原因1:sql_mode中ANSI_QUOTES参数的差异
MySQL的ANSI_QUOTES参数会改变双引号的解析逻辑:
- 未开启时:双引号被视为字符串,
field="type"会匹配Field列值为字符串type的行,这也是root用户能得到正确结果的原因。 - 开启时:双引号被视为标识符(等同于反引号),
field="type"会被解析为比较Field列的值与type列的值,显然没有符合条件的行,因此返回空集。
验证方法
分别以root和view_pjn用户登录MySQL,执行以下命令查看sql_mode:
SELECT @@sql_mode;
如果view_pjn的结果中包含ANSI_QUOTES,而root的结果中没有,即可确认此问题。
解决办法
- 临时解决:执行语句时改用单引号包裹字符串:
show columns from Viewing where field='type'; - 永久解决:修改
view_pjn用户的默认sql_mode(或全局sql_mode),移除ANSI_QUOTES:-- 会话级修改(仅当前登录生效) SET sql_mode = REPLACE(@@sql_mode, 'ANSI_QUOTES', ''); -- 全局级修改(需重启MySQL生效) SET GLOBAL sql_mode = REPLACE(@@GLOBAL.sql_mode, 'ANSI_QUOTES', '');
可能原因2:表名大小写的权限匹配问题
MySQL权限系统对表名的大小写是严格匹配的(即使文件系统不区分大小写):
- 你的
view_pjn用户被授予的是blog.viewing(小写表名)的权限,但执行语句时使用了Viewing(大写首字母)。 - root用户因权限极高,可忽略大小写差异找到表,但普通用户的权限检查会严格匹配表名,导致MySQL认为你访问的
Viewing不在授权范围内,因此返回空结果。
验证方法
执行小写表名的语句测试:
show columns from viewing where field='type';
如果能返回正确结果,即可确认此问题。
解决办法
- 统一表名大小写,执行语句时使用与授权一致的小写表名。
- 若需保留大写表名的使用习惯,重新授予用户对应大小写表名的权限:
GRANT SELECT, INSERT ON `blog`.`Viewing` TO `view_pjn`@`localhost`; FLUSH PRIVILEGES;
内容的提问来源于stack exchange,提问作者P. James Norris
相关产品推荐
相关产品推荐

