如何在MySQL中获取仅用户创建的数据库列表
如何过滤MySQL中的系统库,只显示用户创建的数据库
嘿,我太懂你这个困扰了——用SHOW DATABASES查库的时候,那几个系统库总是凑上来,试了各种LIKE、WHERE写法都没搞定。其实问题出在语法细节和查询思路上,给你两个靠谱的解决方案:
方法一:修正SHOW DATABASES的WHERE子句写法
你之前的写法无效,核心问题是把字段名Database用单引号括起来了——MySQL会把单引号里的内容当成普通字符串,而不是要查询的字段。正确的写法应该用反引号包裹字段名(避免关键字冲突,更安全),然后一次性排除所有系统库:
SHOW DATABASES WHERE `Database` NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys');
注:sys是MySQL 5.7及以上版本新增的系统库,如果你的版本没有,可以去掉这个值。
要是习惯用NOT LIKE的逻辑,也可以这么写:
SHOW DATABASES WHERE `Database` NOT LIKE 'mysql' AND `Database` NOT LIKE 'information_schema' AND `Database` NOT LIKE 'performance_schema' AND `Database` NOT LIKE 'sys';
方法二:直接查询information_schema.SCHEMATA表(更推荐)
其实SHOW DATABASES本质就是查询information_schema.SCHEMATA这个系统表,直接查它能给你更多灵活性——比如后续想加按创建时间过滤、权限过滤都很方便。写法如下:
SELECT SCHEMA_NAME AS `Database` FROM information_schema.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys');
这个查询结果和过滤后的SHOW DATABASES完全一致,但扩展性更强,比如你可以加个ORDER BY SCHEMA_NAME让结果按名称排序。
复盘下之前的错误原因
再给你理清楚为啥之前的写法没用:
SHOW DATABASES NOT LIKE 'information_schema':语法错误,SHOW DATABASES不支持直接跟NOT LIKE,必须搭配WHERE子句。SHOW DATABASES WHERE 'Database' NOT LIKE 'information_schema':单引号把Database变成了字符串常量,相当于拿'Database'和'information_schema'做比较,结果永远为真,自然没过滤效果。
内容的提问来源于stack exchange,提问作者Charlie
相关产品推荐
相关产品推荐

