后端数据库【免费下载链接】mysqlA pure node.js JavaScript Client implementing the MySQL protocol.项目地址https://gitcode.com/gh_mirrors/my/mysql点击查看免费下载导读本文以仓库根目录下的 Changes.md 为脉络系统梳理纯 JavaScript 实现的 MySQL 客户端mysql从 2010 年首个版本v0.1.0到 v2.18.1 十年间的演进轨迹。你将看到连接池、PoolCluster、SSL、类型转换、SQL 转义、流式查询等核心能力是何时、通过哪些版本引入的以及每一项变更在 lib/ 源码中的落点从而建立版本 → 特性 → 实现的完整认知可直接用于版本升级评估与源码研读。一、Changes.md 的定位一份可追溯的发布档案Changes.md 是一份手工维护的逐版本发布清单。文件开头明确说明其维护约定提交 Pull Request 时欢迎补充变更记录发现错误也欢迎提交修正。这份文档的价值在于它不仅是简单的版本号列表更是项目技术决策的编年史——每个版本条目都对应着 index.js 暴露的公开 API、lib/ 下的模块实现以及package.json中依赖版本的变化。从仓库现状package.json中version: 2.18.1可以推断当前仓库状态对应 Changes.md 中HEAD之后的稳定版本。文章后续所有源码引用均以当前仓库实际内容为准。二、版本总览十个里程碑Changes.md 记录了从 v0.1.02010-08-22到 v2.18.12020-01-23的完整发布历史大致可分为三个阶段阶段版本区间标志性内容早期原型v0.1.0 ~ v0.9.6隐式 socket 管理、client.escape()、事务的社区临时方案2.0 重写v2.0.0-alpha ~ v2.0.0全新Connection类、连接池、PoolCluster、流式查询、类型转换体系稳定迭代v2.1.0 ~ v2.18.1SSL、超时体系、错误码扩充、Amazon RDS 证书持续更新、Node.js 版本矩阵扩展2.1 老版本v0.9.x 及之前v0.9 时代的核心接口是mysql.createClient()。这一阶段的演进要点包括v0.9.02011-01-04第一个有版本记录的早期版本此前的 v0.1.0 ~ v0.8.0 发布早于本文件开始维护的时间仅在文件末尾以外部比较链接的形式留存。v0.9.1修复client.escape()在对象上抛异常的问题并明确要求 Node.js v0.4.x 以上。v0.9.22011-08-07底层 socket 从显式管理改为隐式管理这是架构上的一个关键转向为 v2.0 的全新连接模型做了铺垫。v0.9.3默认client.user改为root修复Client#format修改入参数组的问题小数以字符串解析。v0.9.4通过mysql.PACKAGE暴露package.json。v0.9.5切换测试运行器到 urun/utest拆分集成测试为独立文件。v0.9.62012-03-12数组值转义生成 SQL 数组(a, b)形式这一能力在 v2.0 中被正式继承并扩展为嵌套数组批量插入。2.2 v2.0.0一次彻底的协议层重写v2.0.0-alpha2012-05-15是一个**rewrite重写**版本。Changes.md 中给出了一个明确升级注意事项核心事实是旧的Client类被语义更清晰的Connection类取代mysql.createClient()变为mysql.createConnection()新增能力包括流式行的pause()/resume()、多语句查询、存储过程、事务、二进制列BLOB、一致且文档化的错误处理变更了旧有行为BIGINT 转为字符串、二进制数据转为 Buffer、row事件更名为result且 OK/Error 响应也会触发、对象转义行为更强大可能破坏旧代码、支持显式建连以捕获连接错误。Changes.md 中提供了 v2.0 的完整最小示例这是从 0.9 升级的第一块试金石var mysql require(mysql); var connection mysql.createConnection({ host : localhost, user : me, password : secret, }); connection.query(SELECT 1, function(err, rows) { if (err) throw err; console.log(Query result: , rows); }); connection.end();对照当前 index.js 的createConnection实现可以看到它经ConnectionConfig解析配置后构造Connection实例入口形态十年未变。此后的 alpha 系列快速补全了核心能力矩阵alpha2UNIX domain socketsocketPath、nestTables选项解决 JOIN 重名列、?占位符修复、重复connect()检测、默认字符集切换为UTF8_GENERAL_CI避免 MySQL 性能问题、大包16MB收发、BLOB 类型转换修复。alpha3LOAD DATA LOCAL INFILE对应 lib/protocol/packets/LocalInfileRequestPacket.js、旧密码协议兼容、URL 字符串配置支持对应 lib/ConnectionConfig.js#L179-L208 的parseUrl。alpha4changeUser功能、嵌套数组批量插入格式化、Connection.escape、close事件更名end、GEOMETRY 类型解析为对象、nestTables支持字符串分隔符、时区支持默认 local、自定义typeCast、导出 MySQL 列类型常量、connection flags 功能、drain 事件。alpha5mysql.escapeId转义标识符、自定义转义模式config.queryFormat、DATE 列按配置时区转换、supportBigNumbers选项对 lib/ConnectionConfig.js 中supportBigNumbers/bigNumberStrings字段、恢复Connection.statistics()/Connection.ping()。alpha7连接池lib/Pool.js。alpha8Streams 2 模式Node 0.10、Query流式方法、bigNumberStrings选项、??转义序列、multipleStatements选项、DEBUG 按包类型过滤。alpha9pool.query、sqlState属性、池队列上限、connection事件、stringifyObjects选项、PoolCluster 支持。rc1事务支持beginTransaction/commit/rollback、mysql.format()对应 index.js#L91-L95 与 lib/protocol/SqlString.js、本地时区日期支持。rc2/v2.0.0流式LOAD DATA LOCAL INFILE、close事件从查询流发出、Node 0.8 支持。2.3 v2.1 ~ v2.18稳定期的能力补全v2.0 之后进入稳定迭代Changes.md 中每一行都对应一个可追溯的能力点v2.1.0connectTimeout选项与SSL 支持。v2.2.0connection.threadId对应 lib/Connection.js#L22 的初始化字段、池的getConnection保证取到健康连接、PoolCluster 通配符匹配、查询值透传SqlString.format。v2.3.xcharset选项支持 MySQL 名称UTF8/UTF8MB4对应 lib/ConnectionConfig.js#L89-L97 的getCharsetNumber未知字符集抛TypeErrorSSL 默认拒绝未授权连接ssl.rejectUnauthorized默认 true见 lib/ConnectionConfig.js#L51-L54未知 SSL profile 名抛错错误常量补充数据库/全局错误。v2.4.xacquireTimeout池选项、connection.escapeId/pool.escapeId、所有 sequence 支持timeout选项、connectTimeout默认 10 秒、POOL_NOEXIST错误码、PARSER_*/乱序包错误可捕获。v2.5.xSSL presets 从 JSON 改为 JS 存储即当前的 lib/protocol/constants/ssl_profiles.js、Node 0.12 支持、RDS 证书更新。v2.6.xpoolCluster.remove、restoreNodeTimeout选项对应 lib/PoolCluster.js#L216-L223 的节点离线恢复逻辑、多语句下的 LOAD DATA 处理、poolCluster.add对已关闭/重复 id 抛错。v2.7.0池中出错连接被销毁/移除、非致命错误不移除、.query回调非函数时提前报错、入口模块懒加载降低内存占用对应 index.js#L123-L160 的loadClass机制。v2.8.0connect事件、connection.end默认超时 30 秒、changeUser 后池中连接可复用。v2.9.0SSLciphers属性、特定时区的 Date 转换修复。v2.10.x错误码补到 MySQL 5.7.9、JSON 类型常量、秒级小数类型、Node 4/5 支持、修复含裸冒号密码的 URL 解析。v2.11.xPOOL_CLOSED/POOL_CONNLIMIT错误码、池与 socket 的 domain 绑定、大量结果行分配错误修复、BIGINT 负数类型转换修复、SqlString 性能优化并引入sqlstring独立模块。v2.12.0dateStrings支持类型名数组、PoolNamespace.querycluster.of(...).query(...)对应 lib/PoolNamespace.js、错误码补到 5.7.16。v2.13.0池模式支持正则表达式与任意位置通配符、池acquire/release事件、长驻 domain 内存泄漏修复、大包接收减少 Buffer 拷贝、BufferList 优化性能对应 lib/protocol/BufferList.js。v2.14.xError 对象新增sql与sqlMessage属性、修复 MySQL 5.7.17 错误码、Node 8 支持、使用safe-buffer。v2.15.0新增mysql.raw()生成预转义值对应 index.js#L103-L107、修复非英语服务器的changedRows、QUIT时服务器发 RST 的处理、Azure 的mysql_native_passwordauth switch、sqlstring2.3.0 的.toSqlString()覆盖能力。v2.16.0Amazon RDS GovCloud 证书、错误码补到 5.7.21、debug 输出包含连接 ID、Node 9/10 支持。v2.17.x反向类型查找性能优化、修复握手失败时connection.threadId缺失、changeUser 流程支持 auth switch对应 lib/Connection.js 的 changeUser 与 lib/protocol/sequences/ChangeUser.js、Node 11 支持、bignumber.js 6.0.0。v2.18.xlocalInfile选项控制LOAD DATA LOCAL INFILE对应 lib/ConnectionConfig.js#L36-L38 与getDefaultFlags中按localInfile关闭LOCAL_FILES标志 lib/ConnectionConfig.js#L120-L123、新增 RDS 2019 CA、错误码补到 5.7.29、回调早期检测、Node 12/13 支持、非枚举属性查询参数支持。三、SSL 与证书体系的持续演进SSL 支持于v2.1.0引入随后在多个版本中迭代Changes.md 提供了清晰的证据链v2.3.0SSL 连接默认rejectUnauthorized: true可通过ssl.rejectUnauthorized覆盖未知 SSL profile 名直接抛错。v2.5.5SSL presets 从 JSON 迁移到 JS 文件。v2.9.0接受连接ssl选项中的ciphers属性。v2.16.0 / v2.18.0 / v2.18.1Amazon RDS 证书持续更新——GovCloud、2019 CA、yaSSL MySQL 服务器兼容修复。HEAD接受ssl选项的maxVersion与minVersion属性转发给底层tls.createSecureContext()。当前仓库的 lib/protocol/constants/ssl_profiles.js 内置了名为Amazon RDS的完整 profile内含从 2010 年全球证书到 2019 年各区域ap-northeast-1/2/3、ap-south-1、ap-southeast-1/2、eu-west-2/3 等的证书链这正是 Changes.md 多轮Add new Amazon RDS ... certificate条目的实现落点。连接时可用字符串直接引用var connection mysql.createConnection({ host : my-instance.xxx.rds.amazonaws.com, user : bob, ssl : Amazon RDS });对象形式可自定义 CA源码见 lib/ConnectionConfig.js#L33-L35字符串名经getSSLProfile解析未知名抛TypeError。四、错误处理体系的成型Changes.md 显示错误处理是逐步完善的v2.0.0-alpha5typeCast回调改收 Connection 对象、修复 drain 事件参数。v2.0.0-alpha9Error 对象新增sqlState属性。v2.2.0新增connection.threadId使连接标识可追溯。v2.3.1错误常量补充数据库/全局错误conn.release重复调用抛错。v2.4.xPARSER_*、PROTOCOL_PACKETS_OUT_OF_ORDER等错误变为可捕获fatal 错误冒泡时机修正。v2.14.0Error 对象新增sql失败查询的完整 SQL与sqlMessageMySQL 服务端文本消息属性。这些属性在测试中有直接验证例如 test/unit/connection/test-error-trace.js、test/integration/connection/test-error-sqlmessage.js 分别覆盖了长栈跟踪与sqlMessage行为。在 lib/protocol/packets/ErrorPacket.js 中可以找到这些字段从协议包解析出来的实现。五、连接池与 PoolCluster可靠性与可用性演进5.1 Pool连接池在v2.0.0-alpha7引入其后围绕可靠性与队列行为持续加固v2.2.0pool.getConnection确保取到健康连接获取时对复用连接发 ping见 lib/Pool.js#L117-L120。v2.4.0新增acquireTimeout池选项lib/PoolConfig.js#L10-L12默认 10 秒。v2.7.0出错连接从池中销毁/移除非致命错误不移除。v2.11.0POOL_CLOSED、POOL_CONNLIMIT错误码池与底层连接绑定到同一 domain。v2.13.0acquire/release事件用于跟踪。当前 lib/Pool.js 的实现完整体现了这些设计getConnection的三种分支空闲连接复用 → 新建连接 → 排队等待、waitForConnections: false时立即以POOL_CONNLIMIT报错、queueLimit超限时以POOL_ENQUEUELIMIT报错lib/Pool.js#L220-L238。5.2 PoolClusterPoolCluster 在 v2.0.0-alpha9 引入ChangeLog 记录了它的多次强化v2.6.0poolCluster.remove、restoreNodeTimeout选项、关闭后add抛错。v2.13.0模式匹配支持正则表达式与任意位置通配符实现见 lib/PoolCluster.js#L270-L280 的patternRegExp。v2.14.1修复连接生命周期中的闭包持有问题。对应的测试覆盖可见 test/unit/pool-cluster/其中test-pattern.js、test-connection-rr.js、test-connection-random.js分别验证了模式匹配与轮询/随机选择器行为。节点故障计数、离线恢复restoreNodeTimeout与删除逻辑在 lib/PoolCluster.js#L209-L224 中实现。六、转义、格式化与类型转换SqlString 的前世今生Changes.md 对转义能力的演进记录最为细致v0.9.6数组值转义为 SQL 数组。v2.0.0-alpha5mysql.escapeId、config.queryFormat自定义转义。v2.0.0-alpha8??转义标识符序列、bigNumberStrings选项。v2.2.0查询值透传SqlString.format。v2.4.0connection.escapeId/pool.escapeId。v2.11.0转用独立sqlstring模块并持续做数组/对象/字符串/格式化性能优化。当前 lib/protocol/SqlString.js 直接module.exports require(sqlstring)印证了这一演进终点。v2.12.0escapeId支持数字等类型、无效 Date 转义为NULL、Buffer 经toString()后再转义。v2.15.0mysql.raw()生成预转义值对应 index.js#L103-L107配合sqlstring2.3.0 的.toSqlString()覆盖能力可在?占位符中安全插入CURRENT_TIMESTAMP()等函数式 SQL。v2.16.0修复sqlstring非占位符被错误替换的问题。HEADsqlstring2.3.3 修复跨 VM 隔离区Date对象转义并移除过期数组模式。类型转换方面v2.0.0-alpha 系列建立了默认映射数值型TINYINT/SMALLINT/INT/MEDIUMINT/YEAR/FLOAT/DOUBLE/BIGINT转 Number、日期型TIMESTAMP/DATE/DATETIME转 Date、二进制型转 Buffer、文本型转 String。bigNumberStrings、dateStrings、supportBigNumbers、自定义typeCast等选项的演进对应测试见 test/unit/connection/test-type-cast-query.js、test/unit/connection/test-big-numbers.js 等。大整数精度问题在 v2.10.0 之后持续通过bignumber.js处理。七、依赖与 Node.js 支持矩阵的演进7.1 依赖版本轨迹Changes.md 逐版本记录了package.json依赖的更新节奏从中可以看到模块化拆分过程依赖演进轨迹sqlstringv2.11.0 独立化 → 2.2.0 → 2.3.0 → 2.3.1 → 2.3.3HEAD当前 package.json 为 2.3.3bignumber.js2.0.5 → 2.1.4 → 2.3.0 → 2.4.0 → 3.1.2 → 4.0.4 → 6.0.0 → 7.2.1 → 9.0.0 → 9.0.2readable-stream1.1.14 → 2.3.3 → 2.3.6 → 2.3.7safe-bufferv2.14.0 引入 → 5.2.17.2 Node.js 版本支持时间线Changes.md 明确记录了每个 Node.js 主版本获得官方支持的时间0.6v2.5.0、0.8v2.0.0、0.12v2.5.5、4/5v2.10.0、6v2.11.0、7v2.12.0、8v2.14.0、9/10v2.16.0、11v2.17.0、12/13v2.18.0、14/15/16/17HEAD。当前package.json的engines声明为node 0.6。这意味着文章所述特性如maxVersion/minVersion在不同 Node 版本下的可用性需以各自 TLS 能力为前提。八、围绕核心流程的源码佐证将 Changes.md 的抽象条目映射到当前仓库源码可以构建出几条核心调用链建立连接mysql.createConnection(config)index.js#L9-L14→ConnectionConfig解析lib/ConnectionConfig.js#L7-L64→Connection.connect()lib/Connection.js#L64-L117根据socketPath走 UNIX socket 或 TCP并触发Protocol.handshake。执行查询connection.query()→Connection.createQuerylib/Connection.js#L25-L62构建Querysequence → lib/protocol/sequences/Query.js 负责组包与解析 → 结果经 lib/protocol/ResultSet.js 组装。连接池取连接pool.getConnection(cb)lib/Pool.js#L22-L79的空闲/新建/排队三分支与 v2.2.0/v2.4.0/v2.7.0 的变更一一对应pool.query快捷方法在查询结束后自动releaselib/Pool.js#L190-L218。多语句与流式查询multipleStatements: true时连接 flags 追加MULTI_STATEMENTSlib/ConnectionConfig.js#L125-L128Query 结果以数组形式返回流式行由查询事件的result与pause()/resume()机制支撑对应集成测试见 test/integration/connection/test-multiple-statements-streaming.js。九、版本发布机制tool/version-changes.jspackage.json的 scripts 中有一个值得注意的细节version: node tool/version-changes.js git add Changes.md这意味着Changes.md 的维护与 npm 版本发布是联动的——执行npm version时先运行 tool/version-changes.js 自动生成变更记录头部再将 Changes.md 加入暂存区。这与文件开头manually maintained手工维护的说明共同构成了本项目独特的发布工作流日常由贡献者手工补充条目发布时由工具整合归档。十、升级与迁移要点从 Changes.md 提炼的实践清单基于 Changes.md 中零散标注的行为变化整理出对使用者最重要的几条迁移/运维提醒v2.0 是分水岭createClient→createConnectionrow事件 →resultBIGINT 由数字改为字符串返回对象转义规则变化可能影响既有占位符用法。SSL 默认严格自 v2.3.0 起rejectUnauthorized默认开启连接自签名证书的服务器需显式配置ssl对象v2.18.1 修复了 yaSSL 兼容。超时体系connectTimeout默认 10s、acquireTimeout池默认 10s、sequencetimeout三者职责不同分别控制建连、取连接、单次操作的超时。大数处理BIGINT/DECIMAL 超出 JS Number 精度范围时必须开启supportBigNumbers必要时叠加bigNumberStrings。多语句安全multipleStatements默认关闭是刻意的安全决策开启会扩大 SQL 注入面。池的关闭语义pool.end之后不可再getConnection/queryPOOL_CLOSED。结语从 Changes.md 十年间的数百条记录可以还原出mysql这一纯 JavaScript MySQL 客户端由简到繁、由原型到工程化的完整演进脉络协议解析性能BufferList、反向类型查找、错误体系sql/sqlMessage/fatal、可靠性池的 ping 复用、PoolCluster 故障隔离、生态适配Amazon RDS 证书、Azure 认证、MariaDB/Sphinx在 v2.18 收官时已高度成熟。这份变更日志本身就是研读 lib/ 源码与评估升级风险的最佳导航图。赞分享后端数据库【免费下载链接】mysqlA pure node.js JavaScript Client implementing the MySQL protocol.项目地址https://gitcode.com/gh_mirrors/my/mysql点击查看免费下载相关推荐Open CoDesign 路线图全解析从 v0.1 到 v1.0 的产品演进与技术实现Open CoDesign 路线图全解析从 v0.1 到 v1.0 的产品演进与技术实现 导读 Open CoDesign https://link.gitc人工智能AI 应用桌面应用一次溢出让代币几秒归零深度复盘 awesome-buggy-erc20-tokens 收录的 BEC 与 SMT 崩盘案例一次溢出让代币几秒归零深度复盘 awesome buggy erc20 tokens 收录的 BEC 与 SMT 崩盘案例 awesome buggy ercOmniGet 源码构建完全指南一次搞定 tauri build、AppImage 打包与 clippy 基线OmniGet 源码构建完全指南一次搞定 tauri build、AppImage 打包与 clippy 基线 OmniGet 是一款基于 Tauri 2 开桌面应用音视频视频语音教育上一篇解决Gson反序列化难题深度解析ConstructorConstructor构造函数选择机制下一篇SD Maid 2/SE自动化脚本终极指南10个高效批量操作技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考