mysql 导入数据报类型不匹配解决办法
这个报错是因为 SQL 文件中 `endtime` 字段的**默认值设置不符合 MySQL 的 sql_mode 规则**(常见于 MySQL 5.7+ 版本,对时间字段的默认值校验更严格)。我会先解释报错原因,再给你 3 种可操作的解决方案,从临时修复到永久配置都有,你可以按需选择。
### 报错原因说明
MySQL 5.7 及以上版本默认启用了 `NO_ZERO_DATE`、`NO_ZERO_IN_DATE` 等 sql_mode 规则,这些规则会禁止将 `'0000-00-00 00:00:00'` 作为时间字段(如 datetime)的默认值,而你的 SQL 文件第 31270 行正好给 `endtime` 字段设置了这类无效默认值,因此触发 `1067` 错误。
---
### 解决方案(按推荐优先级排序)
#### 方案 1:临时修改 sql_mode(最快,仅当前会话生效)
这种方式无需修改 SQL 文件,先临时关闭严格的时间校验规则,再导入数据:
1. 登录 MySQL 命令行:
```bash
mysql -u root -p
```
2. 执行以下命令修改 sql_mode:
```sql
-- 查看当前 sql_mode(可选,用于对比)
SELECT @@sql_mode;
-- 关闭 NO_ZERO_DATE、NO_ZERO_IN_DATE 等规则
SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
-- 切换到目标数据库
USE wxmedical;
-- 导入 SQL 文件(用 / 分隔路径,避免转义)
SOURCE "E:/Project/DOCTORYU/code/database/wxmedical-26.3.21.sql";
```
执行后等待导入完成即可,此修改仅在当前 MySQL 会话生效,重启 MySQL 后恢复默认。
#### 方案 2:永久修改 MySQL 配置文件(一劳永逸)
如果后续还会导入类似 SQL 文件,建议修改配置文件永久关闭严格时间校验:
1. 找到 MySQL 的配置文件(Windows 通常是 `my.ini`,位置可能在 `C:\ProgramData\MySQL\MySQL Server X.X\my.ini`,注意 `ProgramData` 是隐藏文件夹)。
2. 打开配置文件,在 `[mysqld]` 节点下添加/修改:
```ini
[mysqld]
sql_mode = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
```
3. 保存文件后,重启 MySQL 服务:
```bash
# 以管理员身份运行 CMD,执行重启命令
net stop mysql
net start mysql
```
4. 重新执行导入命令:
```bash
mysql -u root -p wxmedical < "E:\Project\DOCTORYU\code\database\wxmedical-26.3.21.sql"
```
#### 方案 3:修改 SQL 文件(精准修复)
如果你想保留 MySQL 的严格模式,可直接修改 SQL 文件中 `endtime` 字段的默认值:
1. 用文本编辑器(如 Notepad++)打开 `wxmedical-26.3.21.sql`,定位到第 31270 行。
2. 找到类似以下的字段定义:
```sql
`endtime` datetime DEFAULT '0000-00-00 00:00:00' COMMENT '结束时间',
```
3. 将无效默认值改为 `NULL` 或合法时间(如 `1970-01-01 00:00:00`):
```sql
-- 推荐改为 NULL(更合理)
`endtime` datetime DEFAULT NULL COMMENT '结束时间',
-- 或改为合法时间
`endtime` datetime DEFAULT '1970-01-01 00:00:00' COMMENT '结束时间',
```
4. 保存文件后,重新执行导入命令即可。
---
### 验证导入结果
导入完成后,执行以下命令确认数据是否正常:
```sql
USE wxmedical;
-- 查看包含 endtime 字段的表结构(替换为实际表名)
DESC 表名;
-- 查看表数据
SELECT endtime FROM 表名 LIMIT 10;
```
### 总结
1. 报错核心原因:MySQL 严格模式禁止 `'0000-00-00 00:00:00'` 作为 datetime 字段默认值。
2. 最快解决:临时执行 `SET sql_mode = '...'` 关闭严格时间校验,再导入数据。
3. 长期方案:修改 MySQL 配置文件 `my.ini` 中的 `sql_mode`,重启服务后永久生效。