工作里经常有同事发来消息:“帮我看看这条MySQL为什么查出来不对?”“为什么我insert带中文就报错?”“为什么表里加了唯一索引还有重复?”我每次都笑一句:MySQL这玩意儿,看上去就是个数据库服务,真正操作起来,坑都藏在细节里。
这篇笔记是我结合实际项目里一段时间的排障记录整理出来的,标题就叫MySQL数据库操作笔记,但内容不打算做成说明书,更像把我自己折腾过的安装、建表、查询、存过、锁和同步问题,按实际操作顺序重新捋一遍。刚开始用MySQL的人,或者已经写了几年SQL但偶尔被冷门操作卡住的开发者,都可以把这篇当一个速查手册,至少能少走几步弯路。
1. 安装与连接配置:选择不同方式,决定后面省多少事
1.1 版本选择:直接上MySQL 8.0,不纠结5.7
很多新手问我环境里该装哪个版本。我的习惯是:新项目直接选8.0,除非项目里历史依赖、驱动包明确不支持。
理由很直接:
- MySQL 8.0的默认字符集是utf8mb4,5.7时代默认还是utf8,utf8mb4才是完整的UTF-8,emoji表情、生僻字不会变成问号。
- 8.0支持窗口函数、CTE这种现代SQL语法,写复杂统计比5.7愉快太多。
- 8.0默认的加密插件是caching_sha2_password,旧的驱动连接时会报认证失败,这正是很多第三方工具连不上8.0的原因。不过这个可以通过
.my.cnf里配置default_authentication_plugin=mysql_native_password或者改用户插件解决。
刚才热搜里有个“mysql中int+5”,我猜很多人被int(5)弄晕了。其实它不代表“这个整数最多存5位”,int类型就是4字节,范围是-2147483648到2147483647。int(5)那个5是显示宽度,配合zerofill一起用才有意义,比如存一个小数1,设置了int(5) zerofill会显示为00001,但存大数照样不截断。所以别再被int(5)误导了,需要判断整数类型时,还是按存储范围选:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT。
1.2 三种常见安装方式:Windows、Linux、Docker
我前期因为图省事,直接用安装包点了下一步。但实践中发现MySQL安装后真正费时间的不是“下一步”,而是环境配置和启动服务。
Windows装MySQL,现在主流是下载mysql-installer-community,选中Server Only安装。装完后一定要把bin目录加到系统Path环境变量,不然命令行里敲mysql会提示“不是内部或外部命令”。我装完最喜欢先执行一行命令验证:
bash复制mysql --version
能打印版本,就说明环境变量没问题。如果不行,检查安装目录是否包含C:\Program Files\MySQL\MySQL Server 8.0\bin,不要加错成客户端的bin目录。
Linux下安装,不要乱下rpm包去手动依赖,用系统包管理器最省心:
bash复制# Ubuntu/Debian
sudo apt update
sudo apt install mysql-server
# CentOS/RHEL 7
sudo yum install mysql-community-server
Debian系装完会自动启动,CentOS系需要手动systemctl start mysqld,初始密码一般写在/var/log/mysqld.log里,用grep 'temporary password' /var/log/mysqld.log找到再登进去改。
如果只用Docker,那更简单:
bash复制docker run -d --name mysql8 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root123 \
-e MYSQL_DATABASE=testdb \
mysql:8.0
默认端口3306,宿主机做端口映射后,局域网其他机器也能访问。这里要提醒一句,容器实例一旦删除,数据默认一起没了,生产环境务必加-v /my/own/datadir:/var/lib/mysql做数据卷持久化。
1.3 客户端连接和驱动排查:Workbench、Navicat、JDBC
装好服务后,我通常先用命令行连一把:
bash复制mysql -h127.0.0.1 -uroot -p
如果连接报错,先看MySQL服务是否在跑,然后看端口是否监听。Windows下用netstat -ano | findstr 3306,Linux下用ss -lntp | grep 3306,发现3306被占用就得改my.ini里的port。
可视化工具方面,MySQL Workbench是官方出品,用来画ER图、做导入导出都很顺手。Navicat更符合大多数人的操作习惯,连接时最容易遇到的是2003错误,也就是连不上3306端口,原因多半是MySQL没有监听外部IP。需要检查配置文件里是否写了bind-address=0.0.0.0,以及云服务器安全组是否放行端口。
到了代码层,Java JDBC连接串不要写错:
java复制jdbc:mysql://127.0.0.1:3306/testdb?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
C#里用MySqlConnector或MySql.Data时,很多初学者只会写try-catch然后弹一个“操作数据库失败”,看不到真正原因。我建议把所有异常信息拆开记录:
csharp复制try
{
using var conn = new MySqlConnection(connectionString);
await conn.OpenAsync();
// ...
}
catch (MySqlException ex)
{
// ex.Number 是MySQL错误码,比如 1062 主键/唯一键冲突,1146 表不存在
Console.WriteLine($"Code={ex.Number}, Message={ex.Message}");
// 如果ex.InnerException不为空,多半是底层网络或SSL问题
if (ex.InnerException != null)
Console.WriteLine(ex.InnerException.ToString());
}
抓错误码比只抓Message有用得多,1062是唯一键冲突,1451是外键约束冲突,1045是账号密码错误,2002/2003多数是服务或网络不通。把这几个记下来,日常排障效率能快一半。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
