phpMyAdmin 数据库列表默认按数据库名字典序(ASCII升序)排序,不区分大小写且不考虑数字语义;排序逻辑位于 libraries/classes/Display/DatabaseList.php 的 getDatabases() 或 sortDatabases() 方法中,需用 usort() 配合 strnatcasecmp() 实现自然排序。
phpMyAdmin 数据库列表默认按什么顺序排序?
默认情况下,phpmyadmin 的左侧数据库列表是按数据库名的字典序(ascii 顺序)升序排列的,不区分大小写,且不会考虑数字语义(比如 db2 会排在 db10 前面)。这不是 mysql 服务端行为,而是 phpmyadmin 自身前端渲染逻辑决定的。
修改排序需改哪几个文件?
排序逻辑集中在 libraries/classes/Display/DatabaseList.php(v5.0+)或旧版的 libraries/display_tbl.lib.php 中的数据库列表生成部分。但更安全、推荐的方式是通过配置干预——phpMyAdmin 提供了 $cfg['Servers'][$i]['table_coords'] 等配置项,但**数据库列表排序没有直接配置开关**。实际可操作路径只有两个:
- 修改
libraries/classes/Display/DatabaseList.php中getDatabases()或sortDatabases()方法的返回值处理逻辑 - 在
config.inc.php中通过$cfg['Servers'][$i]['hide_db']配合正则隐藏干扰项,间接“整理”可见顺序(治标不治本)
真正生效的修改点通常在 getDatabases() 返回前对数组调用 usort(),例如支持自然排序(natsort 行为):
usort($databases, function ($a, $b) {
return strnatcasecmp($a['name'], $b['name']);
});
自然排序(natsort)和字典排序(strcmp)的区别在哪?
这是最容易踩坑的地方:直接替换 sort() 为 natsort() 会失败,因为 phpMyAdmin 传入的是关联数组(含 name、num_tables 等键),不是纯字符串列表。必须用 usort() + strnatcasecmp(),否则排序后键丢失或结构错乱。
- 错误写法:
natsort($databases)→ 保留键名但不重排索引,前端遍历时顺序不变 - 正确写法:
usort($databases, fn($a,$b) => strnatcasecmp($a['name'], $b['name'])) - 注意:若数据库名含中文或特殊字符,
strnatcasecmp可能表现不稳定,此时应改用mb_strnatcasecmp(需启用 mbstring 扩展)
升级后排序逻辑会被覆盖吗?
会。任何修改源码的方式在 phpMyAdmin 升级时都会被覆盖,且官方不承诺兼容自定义排序。如果你依赖该行为,建议:
立即学习“PHP免费学习笔记(深入)”;
- 将修改封装成 patch 文件,升级后重新应用
- 改用 nginx / Apache 的子请求或反向代理层注入 JS 动态重排 DOM(不推荐,破坏响应式和搜索功能)
- 接受默认排序,用 phpMyAdmin 内置的「筛选」框(顶部搜索)快速定位,比排序更高效
真正的排序需求往往源于数据库命名不规范——比如混用 project_v1、project_v10。与其改 phpMyAdmin,不如统一用 project_001 格式命名,一劳永逸。



















