MySQL无自带类库,常用的是各语言客户端驱动或ORM:Python首选pymysql或mysql-connector-python,Node.js用mysql2,Java必须用mysql-connector-j 8.x;字符集、时区、连接生命周期和SQL模式是数据一致性的关键。

MySQL 本身是数据库服务,不自带“类库”;所谓“常用类库”,实际指各类编程语言连接、操作 MySQL 的客户端驱动或 ORM 工具。选错库或版本不匹配,轻则报 Connection refused 或 Unknown charset: utf8mb4,重则引发 SQL 注入、连接泄漏、时区错乱。
Python:优先用 pymysql 或 mysql-connector-python
pymysql 纯 Python 实现,安装快、调试方便,兼容性好,适合开发和中小流量场景;mysql-connector-python 是 Oracle 官方维护,对新协议(如 caching_sha2_password)支持更及时,但默认开启 autocommit=False,容易漏提交。
- 避免用已停止维护的
MySQLdb(不支持 Python 3.12+) - 若用 SQLAlchemy,后端推荐
pymysql:连接串写成mysql+pymysql://user:pass@host/db - 注意
pymysql默认不处理datetime的毫秒截断,需显式设cursorclass=pymysql.cursors.DictCursor并手动格式化
Node.js:用 mysql2,别用原始 mysql
mysql 包已多年未更新,不支持 Promise、prepared statement 和 utf8mb4_0900_as_cs 等新 collation;mysql2 兼容其 API,但默认启用 Promise 接口,性能更好,还支持 SSL 连接和流式查询。
JTBC CMS(5.0) 是一款基于PHP和MySQL的内容管理系统原生全栈开发框架,开源协议为AGPLv3,没有任何附加条款。系统可以通过命令行一键安装,源码方面不基于任何第三方框架,不使用任何脚手架,仅依赖一些常见的第三方类库如图表组件等,您只需要了解最基本的前端知识就能很敏捷的进行二次开发,同时我们对于常见的前端功能做了Web Component方式的封装,即便是您仅了解HTML/CSS也
- 连接池配置必须设
waitForConnections: true和queueLimit: 0,否则高并发下直接抛Handshake in progress - 执行含中文的 INSERT 时,务必在连接选项中加
charset: 'utf8mb4',否则可能存成问号 - 避免在
connection.query()中拼接用户输入,哪怕用了mysql2.format(),也建议统一走??(字段名) +?(值)双占位符
Java:mysql-connector-j 8.x 是唯一选择
Maven 坐标必须用 mysql:mysql-connector-j(不是旧的 mysql-connector-java),8.0.33+ 版本才完整支持 TLS 1.3 和 caching_sha2_password 插件。JDBC URL 若漏掉 serverTimezone=UTC,java.time.LocalDateTime 读写会偏移 8 小时。
- 连接字符串示例:
jdbc:mysql://localhost:3306/db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true - Spring Boot 3.x 要求驱动版本 ≥ 8.0.33,否则启动报
java.lang.NoClassDefFoundError: com/mysql/cj/protocol/Protocol - MyBatis 中若用
拼 IN 查询,参数超过 1000 项会触发 MySQL 的max_allowed_packet截断,得提前拆分
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test?serverTimezone=UTC",
"user", "pass"
);
PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE id = ?");
ps.setLong(1, 123L);
ResultSet rs = ps.executeQuery();真正麻烦的从来不是“用哪个库”,而是字符集、时区、连接生命周期、SQL 模式这四点——它们不报错,但会让数据悄悄变脏。比如 sql_mode=STRICT_TRANS_TABLES 关闭后,INSERT INTO t(v) VALUES('') 对 NOT NULL 字段居然能成功。









