如何将CSV文件导入MySQL数据库(详细教程)
本文将详细介绍4种主流方法,涵盖命令行、图形界面和编程语言操作,确保不同技术水平的用户都能高效完成导入。
准备工作
-
环境要求
- MySQL 5.6+ 或 MariaDB
- CSV文件需满足:
- 使用逗号分隔(或与
FIELDS TERMINATED BY
一致的分隔符) - 文本用双引号包裹(符合
ENCLOSED BY '"'
) - 第一行为列名(可选)
- 文件编码建议为
UTF-8
- 使用逗号分隔(或与
-
创建目标表
CREATE TABLE employees ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, department VARCHAR(50), salary DECIMAL(10,2) );
关键点:表字段必须与CSV列顺序完全匹配(列名可不同)
4种导入方法详解
方法1:MySQL命令行(最快)
LOAD DATA INFILE '/path/to/employees.csv' INTO TABLE employees FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY 'n' IGNORE 1 ROWS; -- 跳过CSV标题行
常见问题解决:
- 权限错误:添加
LOCAL
关键字(需启用local_infile
)SET GLOBAL local_infile = 1; LOAD DATA LOCAL INFILE 'file.csv' ...;
- 路径问题:Windows路径用
C:\folder\file.csv
格式
方法2:MySQL Workbench(可视化)
- 右击目标表 → Table Data Import Wizard
- 选择CSV文件 → 配置选项:
- 编码:UTF-8
- 分隔符:Comma
- 忽略行:1(跳过标题)
- 映射列字段 → 点击【Import】
方法3:Python脚本(灵活处理)
import pandas as pd import pymysql # 读取CSV df = pd.read_csv("employees.csv") # 连接数据库 conn = pymysql.connect( host='localhost', user='root', password='your_password', database='company_db' ) # 导入数据 df.to_sql('employees', conn, if_exists='append', index=False) conn.close()
优势:可提前用
pandas
清洗数据(如处理空值、格式转换)
方法4:phpMyAdmin(网页管理)
- 进入数据库 → 选择目标表
- 顶部菜单 → 导入 → 格式选 CSV
- 关键设置:
- 列分隔符:,
- 列包裹符:”
- 跳过行数:1
- 执行导入
避坑指南
-
数据截断错误
- 检查字段长度:
VARCHAR(50)
列是否存入了超长字符串 - 解决方案:修改表结构或清理CSV数据
- 检查字段长度:
-
日期格式问题
- CSV日期需转为
YYYY-MM-DD
格式 - 使用预处理:
LOAD DATA ... SET hire_date = STR_TO_DATE(@hire_date_var, '%m/%d/%Y');
- CSV日期需转为
-
特殊字符乱码
- 统一使用UTF-8编码:
CHARACTER SET utf8mb4
- 统一使用UTF-8编码:
-
空值处理
- CSV中用
N
表示NULL:LOAD DATA ... SET salary = NULLIF(@salary, '');
- CSV中用
安全注意事项
- 避免直接导入用户上传的CSV(防注入攻击)
- 生产环境禁用
LOCAL INFILE
时,改用程序中转 - 大文件导入(>100MB)建议分批次处理
性能优化建议
- 导入前禁用索引和约束:
ALTER TABLE employees DISABLE KEYS; -- 执行导入... ALTER TABLE employees ENABLE KEYS;
- 单次导入超过50万行时,用
mysqlimport
工具(命令行变体)
通过合理选择方法,1GB CSV文件可在90秒内完成导入(测试环境:MySQL 8.0,SSD硬盘)。
引用说明
本文方法参考MySQL官方文档LOAD DATA语法、pandas文档to_sql(),并结合了数据库管理最佳实践,安全建议依据OWASP数据注入防护标准。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/20537.html