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 连接和流式查询。 连接池配置必须设
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=trueSpring Boot 3.x 要求驱动版本 ≥ 8.0.33,否则启动报
java.lang.NoClassDefFoundError: com/mysql/cj/protocol/ProtocolMyBatis 中若用
<foreach></foreach>拼 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字段居然能成功。
