phpMyAdmin 是用 PHP 编写的基于 Web 的,最出色的 MySQL 数据库图形用户界面管理平台之一,通过它可以方便的对数据库进行操作,例如建立、复制、删除数据等等,输却无需逐字逐句地输入 SQL 命令。phpMyAdmin 的使用不是本文的重点,在作者刚刚接触这个软件时,配置是一个大问题(事实上对于很多初学者甚至熟练的程序员都一样),本文主要解决 Windows Vista 和 Windows 7 等平台下 phpMyAdmin 的连接问题。
在 保证其它配置都完全正确的前提下,我发现自己的"服务器"(Windows 7 32bit)始终无法正确连接到 MySQL 服务器。在网上搜索问题时发现有不少站长也遇到了同样的困惑,但却找不到解决方案。情况类似,无法使用"localhost"连接到 MySQL 服务器,而用 127.0.0.1 却可以。起初作者也弄不明白这是为什么,几乎绝大部分的网络教材都把 localhost 等同于 127.0.0.1 本地回环地址。而事实上是的,只是在 WinVista 及 Win7 下,localhost 有着另外一个更高层次的含义。
在 Win7 命令提示符(CMD)下 Ping localhost 有如下结果:
正在 Ping WinSeven-PC [::1] 具有 32 字节的数据:
来自 ::1 的回复: 时间<1ms
来自 ::1 的回复: 时间<1ms
来自 ::1 的回复: 时间<1ms
来自 ::1 的回复: 时间<1ms
::1 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms
从上面可以清楚地看出环回没有问题,可是为什么 Ping localhost 回复地址却是"::1","::1"是什么东西?
原 来自从 WinVista 开始,Windows 系统就默认开启了 IPv6 协议,而这个"::1"正是 IPv6 的环回地址(00:00:00:00:00:00:00:01 的压缩形式),但是 MySQL 的常规版本并不支持通过 IPv6 连接,这该如何解决,难道要关闭 IPv6 协议吗?这是一种解决方法,不过也可以通过修改 host 来解决。
从 WinVista 和 Win7 的 hosts 文件里可以看出,localhost 并没有直接被解析为 127.0.0.1 ,而是 DNS 将根据当前连接的协议来自动选择将其解析为 v4 地址还是 v6 地址:
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
而在此我们为了解决 localhost 的连接问题,可以给 host 加上这么一条,以告诉系统强制使用 IPv4 连接。直接在 hosts 文件的末尾加上
127.0.0.1 localhost
这一条语句(需要修改文件权限)。再次 Ping 一下 localhost:
正在 Ping WinSeven-PC [127.0.0.1] 具有 32 字节的数据:
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128
127.0.0.1 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失)
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0 ms,平均 = 0ms
可 以看出 localhost 已经被强制解析为 IPv4 的环回地址。觉得繁琐的网友,可以直接使用 127.0.0.1 替换 localhost 来连接,效果都是一样的,在性能上可能有所差异。另外最新版本的 phpMyAdmin 已经提供了图形界面的配置文件自动生成及下载功能,默认位于 phpMyAdmin/Setup/ 目录下,根据提示要求进行相应设置,然后将 config.inc.php 文件下载并放到 phpMyAdmin 根目录即可。