ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MySQL驱动全解析:从ODBC到JDBC,一次搞定安装连接与排错

MySQL驱动全解析:从ODBC到JDBC,一次搞定安装连接与排错 说实话干MySQL这一行这么久我发现真正劝退新手的往往不是SQL语句写不好也不是表结构设计不合理而是卡在第一步驱动装不上、连不上、报错看不懂。项目标题叫“Mysql 驱动程序”但实际工作中你搜出来的东西可能从ODBC、JDBC一路歪到Windows设备管理器里的代码31搜索词之间差距大到让人怀疑人生。这篇文章就把MySQL驱动这件事从头到尾捋清楚包括它到底是干嘛的、不同类型怎么选、装的时候有哪些坑、连不上怎么排查以及在数据同步、容器化、连接池这些场景下驱动要怎么配。不管你是刚装好MySQL准备写第一个连接代码的新手还是被Navicat、Flink、Docker折磨得头秃的运维开发这篇应该都能给你省点时间。1. 驱动到底是什么装好MySQL不等于能连上1.1 驱动的本质是“翻译官”不是安装包很多人有个误区觉得“驱动”就是一个安装程序点几下装完就万事大吉。实际上驱动是一个协议客户端负责把你的应用程序语言翻译成MySQL服务端能听懂的方言。MySQL服务端就像一个只说普通话的接线员你的Python、Java、Excel、Navicat各自说着不同的方言驱动就是那个同声传译。没有这个翻译你程序里写的connect语句本质上就是对着空气喊话对方根本听不见。更直白一点说驱动承担的事情包括但不限于建立TCP连接、完成MySQL握手协议、处理认证方式8.0默认的 caching_sha2_password 就是在这个环节起作用的、编码转换、发送SQL查询、解析返回的结果集。所以你会发现驱动版本不对或者配置不对的时候报错会非常诡异有的说认证插件不支持有的说SSL握手失败有的干脆卡住不动这些都是“翻译”环节出了岔子。1.2 驱动家族盘点ODBC、JDBC、原生驱动……到底选哪个MySQL官方维护的驱动其实不少名字相近更容易搞混。我见过太多人在这一步栽跟头明明是要给Java用却去下载了ODBC的包装了半天发现没用。驱动名称面向场景典型使用方式是否官方MySQL Connector/ODBCExcel、Power BI、Access导入、BI工具配置DSN数据源官方MySQL Connector/JJava应用、Spring BootJDBC URL连数据库官方MySQL Connector/NETC#、VB.NET、ASP.NETDbConnection对象官方MySQL Connector/PythonPython生产环境官方API官方PyMySQLPython轻量开发、脚本pymysql.connect()第三方mysqlclientPython配合Web框架Django默认驱动之一第三方go-sql-driver/mysqlGo语言sql.Open(mysql, dsn)第三方node-mysql2Node.jsmysql.createConnection()第三方选型逻辑其实很简单官方优先特殊场景再考虑第三方。ODBC适合所有要“通过数据源连接MySQL”的桌面工具尤其是Excel和BI套件JDBC是Java生态的绝对主力Python如果你只是写个脚本跑数据PyMySQL完全足够但部署到生产环境建议官方Connector/Python性能和稳定性更靠谱。记住一个原则即可你用什么语言写程序就去找对应语言的驱动而不是看到一个mysql驱动就装。1.3 那些年被“驱动”背的锅Access引擎、dbc数据、64位系统顺着热搜词看会发现大量搜索指向“请先安装access数据库64位系统驱动程序”“64位引擎不支持dbc数据,只支持access数据”。这其实是另一出戏Microsoft Office自带的Access引擎和ODBC驱动被很多人当成同一件事。当你在Excel里面做“获取数据”时弹出的窗口让你选择数据源你看到列出来的是Access、Excel、SQL Server找不到MySQL于是你开始搜“找不到MySQL驱动”接着又发现Access引擎有32位和64位之分装错了又报错“64位引擎不支持dbc数据”。这里问题的本质是你打开的“选择数据源”向导是微软的ODBC数据源选择器它只列出了微软自己的驱动没列MySQL驱动是因为你还没有安装MySQL的ODBC驱动并注册到系统里。解决办法非常简单先装好MySQL Connector/ODBC然后在“ODBC数据源管理器”里新建一个指向MySQL的DSN数据源名称再回到Excel的导入向导里选择“使用DSN”就能看到了。至于“只支持Access数据”那是你在向导里选错了项目Access引擎和MySQL连接压根不是一回事。2. 从零配好MySQL ODBC驱动位数、运行库、DSN的坑一次说清2.1 安装前的三个检查位数、运行库、ODBC管理器先说最容易踩的坑位数匹配。ODBC驱动分为32位和64位很多人的直观想法是“我的数据库是64位的所以驱动也装64位”。不对真正决定位数的是调用驱动的那个客户端程序。Excel 2016默认是32位的哪怕你的Windows是64位也只能用32位的MySQL ODBC驱动去连接否则报错“二进制文件或代码页不匹配”“找不到ODBC驱动”分分钟让你怀疑人生。判断方法很简单打开任务管理器看Excel进程后面有没有带32位后缀或者在命令行里跑一下Excel的版本信息。再不行就干脆32位、64位驱动都装上反正它们可以共存DSN配置时通过不同的管理器入口区分。接下来是VC运行库。MySQL ODBC驱动在安装时经常依赖Microsoft Visual C 2015 Redistributable尤其是MySQL 8.0的驱动装到一半弹窗报错“缺少vcruntime140.dll”或者直接静默失败十有八九是运行库没装。这个不用纠结版本把2015到2022的运行库直接都装上一次性省事。最后认识一下ODBC数据源管理器。Windows系统里有几个长得一模一样但功能不同的入口32位的是C:\Windows\SysWOW64\odbcad32.exe64位的是C:\Windows\System32\odbcad32.exe。你在控制面板里搜“ODBC数据源”打开的那个默认是64位的所以如果你Excel是32位的在里面新建DSN之后去Excel里仍然找不到这个数据源因为两边看到的管理器不一样。这是非常容易迷惑的一个点建议直接用运行框输入完整路径来打开对应版本。2.2 完整安装步骤从下载到新建DSNMySQL官方下载页面对新手不太友好因为不熟悉的人容易在“MySQL Community Downloads”里面绕晕。正确的路径是打开MySQL官方下载页进入 MySQL Community Downloads找到 MySQL Connector/ODBC。选择对应平台Windows的msi安装包注意区分32位和64位建议都下载。安装时一路Next中间会让你选择“安装哪些组件”保持默认即可。安装完成后按Win R输入odbcad32.exe打开ODBC管理器根据客户端位数选择切到“系统DSN”标签页。点击“添加”拖动列表找到MySQL ODBC 8.0 Unicode Driver选中它。在弹出的配置窗口里填三个关键项就行Data Source Name填自定义名字比如mydbTCP/IP Server填127.0.0.1或真实IP如果是远程需填服务器地址Port默认3306User和Password填你的MySQL账号密码Database填你要连的库名。点Test看到 “Connection successful” 就大功告成。这套做法不但适合Excel连MySQLPower BI、FineBI、甚至一些老的VB程序连MySQL都可以用。多配几个DSN也不冲突只要名字不重复就行。2.3 新建DSN之后为什么还是说“只支持Access数据”这是应用侧选择数据源时的显示逻辑问题。当你从Excel的“数据”菜单进入“获取数据”-“传统向导”时向导里显示的驱动程序列表只包含Microsoft提供的类型。你需要在向导最后一步选择“使用ODBC数据源”然后从下拉框里选你刚建的DSN。如果列表里是空的说明你打开的是64位的ODBC管理器但Excel是32位的两边没对上或者你压根没装好MySQL ODBC驱动系统里就没有对应的驱动条目。另外一个常见误区是有人直接把DSN名字命名为“启动错误 驱动程序……”之类的东西或者复制网上教程时不小心把DSN名搞成中文带空格。DSN名称建议纯英文、无空格、不带特殊字符否则在一些老组件里会解析失败。3. 各语言与工具连接MySQL驱动配置现场实操3.1 Java/JDBCURL、SSL、时区三件套Java连MySQL是面试、工作、JavaWeb项目里最常出现的场景。驱动坐标Maven依赖用的是mysql-connector-j这里有个坑MySQL 8.0之后官方把驱动类名从com.mysql.jdbc.Driver改成了com.mysql.cj.jdbc.Driver很多人把网上老教程的代码贴过来启动直接报ClassNotFoundException。JDBC URL的写法也有讲究推荐直接抄下面这个模板String url jdbc:mysql://127.0.0.1:3306/testdb ?useSSLfalse allowPublicKeyRetrievaltrue serverTimezoneAsia/Shanghai characterEncodingutf8 rewriteBatchedStatementstrue;逐项解释一下为什么写这些参数。useSSLfalseMySQL 8.0默认开启SSL校验开发环境没有有效证书时不关掉会报SSL连接错误生产环境请反着来用trueallowPublicKeyRetrievaltrue用于caching_sha2_password认证时允许客户端从服务端获取RSA公钥不加会报Public Key Retrieval is not allowedserverTimezoneAsia/Shanghai驱动连接时如果不指定时区8.0会报The server time zone value XXX is unrecognized这种错误。配置连接池也一样HikariCP里这些参数照样适用HikariConfig config new HikariConfig(); config.setJdbcUrl(url); config.setUsername(root); config.setPassword(password); config.setDriverClassName(com.mysql.cj.jdbc.Driver);3.2 Python、Node、.NET 的连接姿势Python开发里最常见的选择是PyMySQL轻量、好装、不用编译适合脚本和中小型项目。安装一行命令pip install pymysql连接代码也很直观import pymysql conn pymysql.connect( host127.0.0.1, port3306, userroot, passwordpassword, databasetestdb, charsetutf8mb4, cursorclasspymysql.cursors.DictCursor ) with conn.cursor() as cursor: cursor.execute(SELECT * FROM users LIMIT 5) rows cursor.fetchall() print(rows) conn.close()Node.js的mysql2也很简单const mysql require(mysql2/promise); const conn await mysql.createConnection({ host: 127.0.0.1, user: root, password: password, database: testdb }); const [rows] await conn.query(SELECT * FROM users LIMIT 5); console.log(rows);.NET这边用的是Connector/NET连接字符串大概是Server127.0.0.1;Databasetestdb;Uidroot;Pwdpassword;SslModePreferred;。几乎所有语言的连接方式都遵循同一个套路协议参数 主机地址 端口 账号密码。只要你理解了驱动的本质换语言只是换一个语法壳子。3.3 数据同步场景Flink同步MySQL到ClickHouse的驱动配置Flink同步到ClickHouse是这几年特别常见的需求很多热词里也搜到这个场景。这里牵扯到的“驱动”比上面写的要复杂一层Flink CDC读取MySQL的binlog日志本质上是通过一个专门的数据采集组件去连接MySQL它也需要走MySQL驱动协议但配置项多了很多。Flink CDC连接MySQL时核心配置是这几项CREATE TABLE mysql_source ( id INT, name STRING, PRIMARY KEY (id) NOT ENFORCED ) WITH ( connector mysql-cdc, hostname 127.0.0.1, port 3306, username root, password password, database-name testdb, table-name users, server-id 5400, scan.startup.mode initial, scan.incremental.snapshot.enabled true );这里真正会踩的坑有三个第一个是server-id如果多台同步任务用了同一个server-idMySQL会误判为冲突而断开连接第二个是MySQL必须开启binlog且格式必须是ROW否则Flink CDC根本拿不到变更数据第三个是MySQL 8.0默认的认证插件问题如果CDC组件用的驱动太老会报Authentication plugin caching_sha2_password cannot be loaded。3.4 Docker里的MySQL容器化之后驱动连不上的常见原因Docker部署MySQL已经成为标配但容器化之后的驱动连接问题和裸机安装完全不一样。最常见的报错不是驱动装错了而是在宿主机上连接时端口映射没弄对。启动的时候忘记加-p 3306:3306应用跑在宿主机上去连127.0.0.1:3306自然连不上。另一个经典坑是MySQL 8.0镜像默认的认证插件。你需要确认镜像里MySQL的版本8.0版本用的是caching_sha2_password老驱动不认。快速验证方法就是用一个较新的客户端去连如果还报认证插件错误就去容器里执行docker exec -it mysql8 mysql -uroot -p然后执行SQLALTER USER root% IDENTIFIED WITH mysql_native_password BY 你的密码; FLUSH PRIVILEGES;注意这个操作为了兼容老驱动没问题但生产环境还是建议升级驱动而不是降级认证插件。容器场景下的驱动连接本质就是你得保证“客户端能联通宿主机的映射端口”和“客户端驱动支持服务端的认证方式”这两个前提。4. 连夜排查实录常见驱动报错与解决思路4.1 连接报错速查表这些年我收集了不少MySQL连接相关的报错整理出一个速查表方便你对号入座。报错信息真正原因处理方向ERROR 2003 (HY000): Cant connect to MySQL server服务没起、端口不通、防火墙拦了检查net start mysql看3306是否监听防火墙放行ERROR 1045 (28000): Access denied账号密码错误或Host权限不对检查用户表和授权GRANT ALL ON db.* TO userhostPublic Key Retrieval is not allowedJDBC连接MySQL 8.0缺少RSA公钥取回权限URL加allowPublicKeyRetrievaltrueSSL connection error: unknown errorSSL握手失败开发环境加useSSLfalse生产检查证书Client does not support authentication protocolMySQL 8.0默认认证插件不被老驱动支持升级驱动或临时把用户改回mysql_native_passwordUnknown database xxx数据库名不对检查连接串和建库语句ClassNotFoundException: com.mysql.cj.jdbc.Driver驱动JAR没引入或类名写错检查Maven依赖/驱动包路径驱动程序无法通过使用安全套接字层SQL Server/JDBC相关TLS报错这类其实是SQL Server的报错与MySQL无关别搞混值得专门说的是net start mysql时提示“MySQL服务无法启动”。这个和驱动没半毛钱关系是服务本身起不来常见原因是配置文件的datadir路径不对、端口被占用、或者权限不足。建议先看MySQL的错误日志位置一般在C:\ProgramData\MySQL\MySQL Server 8.0\Data\*.err或者Linux下的/var/log/mysql/error.log。4.2 不是所有的“驱动”都是MySQL驱动说说代码31和数字签名热词里混进去了大量Windows系统驱动问题比如“代码31”“Windows无法验证此设备所需的驱动程序的数字签名”“Generic Bluetooth Radio驱动程序错误”“CP210驱动程序”“FT232RL驱动程序”。这些确实叫“驱动程序”但它们跟MySQL没有关系是USB设备、蓝牙、串口芯片的驱动。如果平时搜“mysql 驱动程序”时被这些信息带偏过我建议你建立一条排查思路先看报错发生在哪个环节。如果你的报错发生在连接数据库、写代码、用Excel导入数据时那是MySQL驱动问题如果你的报错发生在设备管理器、插入USB设备、蓝牙配对时那是系统设备驱动问题去设备制造商的官网下载对应驱动即可。值得一提的例外是有些数据库驱动安装程序在Windows上会触发系统安全策略比如安装MySQL ODBC驱动时提示“无法验证此设备所需的驱动程序的数字签名”。这时先别急着关驱动签名强制先确认安装包是不是从官网下载的。如果安装包来源没问题可以右键管理员运行或者临时在启动设置里禁用驱动签名强制测试环境可用装完再恢复。生产机器建议直接升级到官方签名版本避免安全策略把系统盘符搞出幺蛾子。4.3 Navicat、DBeaver这类GUI工具连不上的排查思路Navicat for MySQL 是老牌工具装破解版的人太多经常装到一半系统报错或者连不上。这里我不鼓励用破解版但排查思路是一样的先确认Navicat用的驱动版本。老版本Navicat连接MySQL 8.0会报经典的Client does not support authentication protocol requested by server。解决方向有两个升级Navicat到较新版本或者把MySQL用户认证方式改回老式插件。改老式插件比较快但个人建议还是在测试库上操作因为生产环境改用户认证影响面太大。顺便多说一句Navicat改连MySQL 8.0时连接设置里的“高级”标签页可能会让你勾选useSSL如果MySQL没配SSL证书这个选项会导致连接失败取消勾选即可。DBeaver则好一些默认会走自动协商一般不会在SSL上卡人。5. 被问烂的MySQL驱动面试题与技术扩展5.1 驱动在高并发场景下的真实作用连接池了解一下“MySQL的数据库连接池”是搜索热词里一个绕不开的点。连接池本质上是把数据库连接也就是驱动建立的物理连接缓存复用避免每次访问都创建新连接带来的握手和认证开销。一个连接从建立到认证完成动辄几十毫秒连接池可以让这个成本降低到接近零。主流的连接池有Java的HikariCP、Druid、Python的DBUtils等。配置时有几个参数直接影响工程效果maximumPoolSize不能盲目调大因为MySQL默认最大连接数是151超过就要改服务端配置connectionTimeout设置为1到3秒比较合理太短在高并发时会频繁创建连接太长则会让请求堆积maxLifetime/wait_timeout必须小于MySQL服务端的空闲超时时间否则连接池里的连接被服务端回收了池子还傻乎乎地发SQL会报Connection is not available或者Communications link failure。5.2 从驱动到SQL到事务一条完整的技术链路MySQL的存储过程、事务处理、排序等操作听上去跟驱动没关系但它们都跑在驱动建立的连接之上。驱动负责把事务语句发给服务端服务端负责事务的提交回滚。所以你在面试里回答问题“事务的ACID特性是什么”“隔离级别有哪几种”之前最好先搞清楚驱动如何影响事务行为连接是自动提交还是手动提交由驱动侧的setAutoCommit(false)决定然后调用commit()或rollback()。还有字符集的问题。连接字符集、数据库默认字符集、表字符集不一致的时候驱动会在结果集转码时产生乱码。命令行看着正常一通过程序查询中文全变问号大概率是连接串没加characterEncodingutf8mb4或者建库时没指定utf8mb4。记住现代MySQL统一用utf8mb4就对了utf8在MySQL里并不完全等于真正的UTF-8四字节表情符号会丢。5.3 如果你在面试被问“驱动怎么选”这样答最稳说实话MySQL驱动的面试题问得不算特别深但很多人确实答不好。我问你一个问题假设你的Java项目里mysql驱动和MySQL服务端版本不一致会有什么问题这个问题的标准答法是驱动和服务端之间通过协议通信协议有小版本兼容性机制。通常较新的驱动能连较旧的服务器但反过来就未必旧驱动连新服务器时可能因为新增的认证插件如caching_sha2_password、默认SSL开启、字符集变化导致连接失败。再来一个ODBC和JDBC的区别是什么可以参考下面这个角度来答ODBC是微软主导的一套通用数据库访问接口不是MySQL专属通过ODBC驱动管理器适配不同的数据库JDBC是Java语言定义的数据库访问标准由Java程序直接调用两者解决的问题类似但适用生态完全不同。ODBC的优势在于跨语言、跨工具很多BI软件都支持JDBC的优势在于Java生态高度统一各种框架都有现成封装。5.4 离线环境的MySQL驱动安装Linux服务器上的实操生产环境很多是内网没法直接访问外网下载驱动白白浪费半天时间。这里说一个血泪教训提前在开发机上下载好对应版本的驱动包放到内网机器上安装。Linux下安装MySQL连接库最常见的方式是rpm包# 安装MySQL官方官方版rpm源 wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm rpm -ivh mysql80-community-release-el7-3.noarch.rpm yum install mysql-connector-odbc -y如果连yum源都访问不了就改去官方下载tar包解压后手动拷贝到对应的库目录再配置环境变量。另外Windows下还有一种常见操作是用NTLite给系统镜像集成USB3.0和NVMe驱动这属于装机驱动的范畴不是MySQL相关但在离线装机的场景里容易被搜到顺带说一句分清场景再操作别在装MySQL的时候去动系统镜像。结尾的几句实在话我这些年给不少人排查过MySQL连接的问题印象最深的就是大家遇到报错时第一反应是把报错原文复制进搜索引擎然后被各种无关的“驱动程序”结果带偏。驱动这种事儿其实跟剥洋葱差不多一层层拆开先确认是不是驱动本身的问题再确认是版本兼容问题还是配置问题最后再查网络和权限。如果时间紧建议只在官网下载版本较新的驱动然后把连接串里的时区、SSL、字符集、认证这几个参数提前配好能省掉大量无意义的排查。最后再补一句我个人的习惯装驱动前先看一眼Windows的设备位数和应用位数用Excel连MySQL的朋友尤其要记住这个一分钟的小动作比刷遍搜索页管用多了。希望这篇能把你在MySQL驱动上绕的弯路一次拉直。
返回列表