一、环境及问题描述

1. 环境

操作系统:win10家庭版,64bit

python版本:Python 2.7.15

mysql版本:mysql 5.4.3

2. 问题描述

最近跟公司申请电脑,预装win10家庭版,懒得刷回win7,于是将开发环境迁移过来。但是在python上用MySQLdb去连接mysql的时候就直接报错了:“2003 ,Can't connect to MySQL server on 'localhost' (10061)”。

二、问题解决

1. mysqld开启

一般像这个问题,搜到最多的其实就是叫检查mysql后台服务有没有开启,可是我这边的mysqld不仅正在运行,而且还能用Navicat连接上去,故可以排除。

2. my.ini文件

然后就是修改my.ini文件的方法,一般是修改bind-address = 127.0.0.1或0.0.0.0,但是修改还是不起作用。

3. hosts文件

就是在hosts文件里增加一个映射,127.0.0.1 localhost。修改后,重启电脑,同样没有反应。

但是这个修改是很关键的,后面会说到。

4. 从localhost到127.0.0.1

后面搜到一个匹配度很高的问题,也是用Navicat可以连接 (主机名也是localhost),但是用python的时候就不行了,这个时候有点觉得是localhost在不同的软件中的解析问题。

问了一下盆友,盆友说没用过mysql,但是用过Oracle(爱立信也是土豪公司),意思是Oracle需要配置自己的解析文件,不是系统的hosts文件,叫我可以看看库函数底层源码云云。

于是我顺手在win10的powershell里 敲下:ping localhost,这个时候收到的竟然不是127.0.0.1的回复,而是::1,所以::1是什么鬼?

5. win10 如何解析localhost

实际上,win10解析localhost的时候, 会把 localhost 解析为 ipv6 地址 ::1 而不是 127.0.0.1!所以解决办法就是改回解析为127.0.0.1:

  • 打开注册表,找到键 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\tcpip6\Parameters
  • 添加类型为DWORD 名字为 DisabledComponents 的项(已经有了的不用添加直接改值)
  • 然后修改值为 20,值类型为16进制
  • 保存注册表,重启电脑。

重新连接mysql,终于解决问题!

所以问题的关键就是系统怎么解析localhost,但是再深入一步,到底在mysql中,以localhost和127.0.0.1两种方式连接的时候,区别到底在哪里呢?

三、mysql的主机为localhost和127.0.0.1的区别

1. 类unix系统

类Unix系统下,如果不使用-h指定主机名或者使用了localhost,那么会使用unix domain socket与mysql服务器通信;如果host指定为'127.0.0.1',则使用TCP/IP协议进行通信。

2. windows系统

如果mysql在win上跑,如果系统开启了--enable-named-pipe,然后访问服务器的时候没有指定hostname,那么mysql客户端会以pipe为优先连接,如果连接失败,那么再会去尝试使用TCP/IP去连接。你可以指定hostname为.在win下强制使用pipes。

如果host指定为'127.0.0.1',依然是使用TCP/IP协议进行通信。

3. 一点猜测

如上所述,在windows环境下,实际上在底层是无法用localhost的方式去连接mysql的,据说从win10开始会逐渐支持unix domain socket,但是现在用的mysql还是无法用这种方式去连接。

但是如Navicat的软件或者用python的库函数,怎么又能用localhost的方式去连接呢?

我猜测想Navicat这种软件,底层应该会将localhost解析为127.0.0.1,接着才去建立连接。至于python的MySQLdb,则会调用系统的函数去解释,由于win10将localhost解释为ipv6的地址,因此才会出问题。

四、参考

1. WIN10 LOCALHOST 解析为 IPV6地址 ::1 的解决办法

2. mysql中localhost和127.0.0.1的区别

3. Windows 10 17063 开始支持 UNIX Domain Socket

(完)

win10,python连接mysql报”Can't connect to MySQL server on 'localhost' (10061)”的更多相关文章

  1. MySql突然连接不上,报Can't connect to MySQL server on 'localhost' (10061),并且没有mysqld时解决方案

    今天连接数据库时突然连接不上,前一天还是好好的.打开数据库就报 Can't connect to MySQL server on 'localhost' (10061) 一直也知道是MySQL服务没有 ...

  2. 连接mysql报错:error 2003 (hy000):can't connect to mysql server on 'localhost' (10061)

    一.mysql 的bin目录下有个MySQLInstanceConfig.exe,运行就可以进行创建数据库实例,创建实例时也可以生成windows 服务,把服务设置成自动启动就可以了 二.安装在D盘的 ...

  3. Navicat for Mysql连接mysql数据库时出现 2003-Can't connect to MySql server on 'localhost'(10061)

    一.环境:linux服务器下 二.问题:在windows7下使用Navicat for Mysql连接mysql数据库时出现 2003-Can't connect to MySql server on ...

  4. SELinux导致PHP连接MySQL异常Can't connect to MySQL server的解决方法

    原文摘自:http://www.jb51.net/article/52581.htm 这篇文章主要介绍了SELinux导致PHP连接MySQL异常Can't connect to MySQL serv ...

  5. ruby使用DBI连接MySQL数据库发生异常:in `error': Can't connect to MySQL server on 'localhost' (10061) (DBI::DatabaseError)

    Ruby使用DBI连接MySQL数据库一般为: require "dbi" dbh = DBI.connect("dbi:Mysql:test:localhost&quo ...

  6. Asp.Net连接Mysql报错Out of sync with server

    Asp.Net连接Mysql报错Out of sync with server 原因:程序引用的MySql.Data.dll版本高于服务器版本 解决:下载一个低版本的MySql.Data.dll,项目 ...

  7. 如何解决远程连接mysql出现Can’t connect to MySQL server on (111 “Connection refused”)的问题

    如何解决远程连接mysql出现Can’t connect to MySQL server on (111 “Connection refused”)的问题 开放Mysql的远程连接 在服务器上登录my ...

  8. 【centOS】【xshell】xshell连接虚拟机上的centOS,操作途中突然断开连接,报错:connect closed by foreign host

    如题  xshell连接虚拟机上的centOS,操作途中突然断开连接,报错:connect closed by foreign host 快捷解决方法: 在虚拟机上centOS重新启动网络,即可解决问 ...

  9. MySQL8.0报错Can't connect to MySQL server on 'localhost' (10061)的解决办法

    MySQL8.0报错Can't connect to MySQL server on 'localhost' (10061)的解决办法 事情的起因     今天课堂上要展示小组项目,需要用一个软件叫W ...

随机推荐

  1. Android sdk 更新后编译不过,【Could not find com.android.sdklib.build.ApkBuilderMain】

    最近更新了Android sdk,发现编译不过了 解决方案: 进入 sdk/tool/lib/ 目录下,看看有没有 sdklib.jar 这个文件,如果没有看看有没有sdklib-25.*.*.jar ...

  2. java IO 学习(三)

    java IO 学习(一)给了java io 进行分类,这一章学习这些类的常用方法 一.File 1.创建一个新的File的实例: /** * 创建一个新的File实例 */ File f = new ...

  3. /dev/mem直接操作硬件寄存器

    /******************************************************************************* * /dev/mem直接操作硬件寄存器 ...

  4. php中require_once与include_once的区别

    首先include_once仅包含文件一次,如果没有文件,会发出警告,并继续执行. 而require_once也是仅包含文件一次,但是如果程序中没有找到文件,则程序会中止执行.

  5. SqlServer高级特性--存储过程

    需求: 用户需要提交加密数据,提交之后需要解密还原,还原有两种结果:成功和失败! 100个用户,之前7天,判断是否有提交数据,如果有提交有数据,判断是否解密成功(分别存在两个表中).如果没有提交,显示 ...

  6. 【thrift】什么是rpc

  7. PAT 1021 个位数统计 C语言

    1021. 个位数统计 (15) 给定一个k位整数N = dk-1*10k-1 + ... + d1*101 + d0 (0<=di<=9, i=0,...,k-1, dk-1>0) ...

  8. 利用OCR文字识别+百度算法搜索,玩转冲顶大会、百万英雄、芝士超人等答题赢奖金游戏

    [先上一张效果图]: 一.原理: 其实原理很简单: 1.手机投屏到电脑: 2.截取投屏画面的题目部分,进行识别,得到题目和三个答案: 3.将答案按照一定的算法,进行搜索,得出推荐答案: 4.添加了一些 ...

  9. Flash 开发环境搭建和文字滚动效果实例

    Flash 开发环境搭建和文字滚动效果实例 一.Flash 开发环境搭建 Flash发布的时候可以将资源(即将库中的元件)集成到swf运行文件中.Flash没有代码自动输入补全功能,因此需要一个英文一 ...

  10. Linux进程间通信——使用信号量(转)

    这篇文章将讲述别一种进程间通信的机制——信号量.注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物.有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信——使用信号.下面 ...