可能有很多朋友都会碰到一个问题不知道 127.0.0.1 与 localhost 有什么区别, 但是有的时间会发现使用 localhost 连接不了, 但是改成 127.0.0.1 即可了连接了, 那么他们会有什么区别呢, 下面我给大家介绍.
mysql -h 127.0.0.1 的时候, 使用 TCP/IP 连接, mysql server 认为该连接来自于 127.0.0.1 或者是 "localhost.localdomain"
mysql -h localhost 的时候, 是不使用 TCP/IP 连接的, 而使用 Unix socket; 此时, mysql server 则认为该 client 是来自 "localhost"
mysql 权限管理中的 "localhost" 有特定含义:
注意: 虽然两者连接方式有区别, 但当 localhost 为默认的 127.0.0.1 时, 两种连接方式使用的权限记录都是以下的 1.row 的记录(因为记录在前, 先被匹配)
- *************************** 1. row ***************************
- Host: localhost
- User: root
- ......
- *************************** 2. row ***************************
- Host: 127.0.0.1
- User: root
证明:
- shell> mysql -h 127.0.0.1
- mysql> status;
- Currentuser: root@localhost
- SSL: Notin use
- Current pager: stdout
- Using outfile: ''
- Using delimiter: ;
- Server version: 5.1.33-log Source distribution
- Protocol version: 10
- Connection: 127.0.0.1 via TCP/IP
- shell> mysql -h locahostmysql> status;
- Currentuser: root@localhost
- SSL: Notin use
- Current pager: stdout
- Using outfile: ''
- Using delimiter: ;
- Server version: 5.1.33-log Source distribution
- Protocol version: 10
Connection: Localhost via UNIX socket
发现问题
昨天在帮同事编译安装 Linux 环境时, 遇到一个问题:
web 服务器是 apache, 数据库是 MySQL.
于是写了一个测试连接数据库的 PHP 页面:
$mysql = mysql_connect('localhost','root','');
打开 http://localhost/test.php 测试
提示: Can't connect to local MySQL server through socket...
检查环境正常
以为是数据库没有启动, 于是查看一下进程, MySQL 在进程里, 重启了一下 MySQL.
使用 mysql -u root -p 可以进入 MySQL 操作界面
直接使用 / usr/local/php5/bin/php /web/test.php 执行可以连上数据库
apache 也重启了, 一样无效
疑点: 为何网页执行失败, 命令执行却成功
这下就郁闷了, 使用 php 命令直接执行就成功, 通过网页执行就失败. 难道是 apache 导致? 网上搜索了大堆资料也没找到解决方案, 重新编译安装 apache 问题依旧.
把 localhost 改成 127.0.0.1 成功
把 localhost 改成 127.0.0.1 后竟然连接成功了, 开始陷入思考困局: localhost 失败 127.0.0.1 却成功?
ping localhost 地址是 127.0.0.1 没错
打开 hosts 加入
127.0.0.1 qttc
使用 qttc 当主机连接也正常, 唯独就不认 localhost.
localhost 连接方式不同导致
为了了解 PHP 连接数据库时, 主机填写 localhost 与其它的区别阅读了大量资料, 最后得知:
当主机填写为 localhost 时 mysql 会采用 unix domain socket 连接
当主机填写为 127.0.0.1 时 mysql 会采用 tcp 方式连接
这是 linux 套接字网络的特性, win 平台不会有这个问题
解决方法
在 my.cnf 的 [mysql] 区段里添加
protocol=tcp
保存重启 MySQL, 问题解决!
来源: http://database.51cto.com/art/201806/575745.htm