MySQL LOAD DATA 导入带引号换行的 CSV 怎么设置
MySQL 用 LOAD DATA 导入 CSV 时,真正决定结果的不是“文件扩展名是不是 csv”,而是文件里的三种边界是否和 SQL 一致:字段之间用什么分隔、字段是否由引号包住、每条记录在哪里结束。带逗号的备注要靠 ENCLOSED BY 保住,字段内换行要和 LINES TERMINATED BY 区分,字段中的双引号则要遵守生成器的转义约定。
常见的双引号 CSV 可以从FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\'和正确的LINES TERMINATED BY开始;如果一条记录的备注跨了多行,只要换行位于包围引号内,就应当仍属于同一字段。
- MySQL 默认按制表符分字段、按换行分记录,不会默认识别双引号 CSV。
FIELDS要放在LINES前面;Windows 导出的文件通常需要\r\n。- CSV 里的
""可表示一个字面双引号;反斜杠转义则要让ESCAPED BY与生成器保持一致。
先把 CSV 的三层边界对齐
先不要急着改表结构。打开文件的原始内容,确认一行记录使用的是 LF(\n)还是 CRLF(\r\n),字段分隔符是不是逗号,文本字段是否总是由双引号包围。文件首行如果真的是列名,再使用 IGNORE 1 LINES;没有表头却加上它,会悄悄丢掉第一条数据。
下面的示例假设文件内容是:第一行是表头,note 里既可能有逗号,也可能有被双引号包住的换行;文件来自 Windows 导出,所以记录结束符为 CRLF。
order_id,customer_name,note 1001,"华东仓库","第一行备注 第二行备注" 1002,"华南仓库","含有逗号,仍是一个字段"

对应关系可以记成:逗号属于字段边界,双引号属于字段包围规则,CRLF 属于记录边界。三者混在一个参数里处理,最容易出现“备注被拆成两列”或“下一行顶到上一条记录”的错觉。
FIELDS 如何处理引号、逗号和转义
对上面的文件,可以先用这一条语句。示例把数据读入临时表,便于先抽样核对;LOCAL 表示文件从客户端机器提供,和字段解析规则是两个不同问题。
LOAD DATA LOCAL INFILE '/data/import/orders.csv'
INTO TABLE import_orders
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
ESCAPED BY '\\'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(order_id, customer_name, note);
FIELDS TERMINATED BY ',' 告诉 MySQL 逗号是字段分隔符,ENCLOSED BY '"' 让两端的双引号不进入字段值。输入解析时,OPTIONALLY 不会改变包围符的识别;它主要影响输出文件是否给字符串列加包围符,所以导入时不必把它当成“允许换行”的开关。
转义字符必须看 CSV 生成器的约定:
| 文件中的写法 | LOAD DATA 重点设置 | 导入后的含义 |
|---|---|---|
"华东,仓库" | TERMINATED BY ',' + ENCLOSED BY '"' | 逗号是字段内容 |
"他说 ""可以""" | 保留 ENCLOSED BY '"' | 成对双引号变成一个字面双引号 |
"他说 \"可以\"" | ESCAPED BY '\\' | 反斜杠后的字符按转义规则读取 |
不要为了“更像标准 CSV”盲目把 ESCAPED BY 改成双引号。文件若用成对双引号表达字面引号,MySQL 本身就能按包围符规则识别;只有当上游确实用某个字符做转义前缀时,才让该参数匹配上游。

LINES TERMINATED BY 如何保留字段内换行
LINES TERMINATED BY 描述的是一条记录的结束符,不是字段内容禁止出现换行。只要多行文本仍处在双引号包围范围内,解析器就应把它们归入同一个 note 字段。关键是按真实文件选择行结束符:
- Linux 或多数容器导出的 LF 文件:
LINES TERMINATED BY '\n'。 - Windows 程序常见的 CRLF 文件:
LINES TERMINATED BY '\r\n'。
如果把 CRLF 文件写成 \n,字段末尾可能残留 \r;反过来把 LF 文件写成 \r\n,也可能让行尾无法按预期匹配。遇到错位时,先用十六进制查看文件末尾的字节,比反复改 SQL 更快。
另外,IGNORE 1 LINES 只按文件开头忽略一条记录,不会修复中间某一行的引号不闭合。若某行的双引号缺失,后续换行都可能被当成前一条字段内容的一部分,这时要先修复文件或重新导出。
导入前后的检查与回滚
正式表前先准备一个结构相同的临时表,在临时表里抽样检查四件事:总行数、含逗号的备注、跨行备注、双引号是否被还原为一个字符。可以用简单查询把最容易错的字段挑出来。
-- 只核对解析后的文本,不修改正式表
SELECT order_id, customer_name, note
FROM import_orders
WHERE note LIKE '%,%'
OR note LIKE CONCAT('%', CHAR(10), '%')
OR note LIKE '%"%'
LIMIT 20;
如果抽样结果把一条 CSV 记录拆成多条,优先回看三项:文件实际行尾、字段是否都用同一种包围符、上游对双引号采用成对写法还是反斜杠写法。确认无误后再导入正式表;临时表出现错列时直接清空或删除临时表,避免用错误数据覆盖正式数据。
MySQL 8.4 手册的 LOAD DATA 说明还特别提醒,FIELDS 与 LINES 的格式必须和生成文件时一致。把这条规则写进导入脚本旁边的注释或 README,下一次换导出工具时就能及时发现格式变化。
常见问题
不写 FIELDS 和 LINES 时,MySQL 默认按什么解析?
默认字段分隔符是制表符,记录结束符是换行,也不默认使用包围符;普通逗号 CSV 不能直接依赖默认值。
OPTIONALLY ENCLOSED BY 能解决字段内换行吗?
不能。它不是换行开关,换行归 LINES TERMINATED BY 管;输入时是否剥离包围符也不因 OPTIONALLY 改变。
为什么只改 TERMINATED BY 还是会错列?
因为字段里有逗号时,必须同时告诉 MySQL 双引号是包围符;如果字段里还有双引号,还要继续匹配上游的成对引号或转义字符约定。
Go crypto/sha256 怎么边读文件边计算校验值
- 上一篇
- Go crypto/sha256 怎么边读文件边计算校验值
- 下一篇
- Go GOPROXY 设置为 off 后为什么新依赖下载失败
-
- 数据库 · MySQL | 1小时前 |
- MySQL utf8mb4 排序规则不一致时怎么处理连接报错
- 101浏览 收藏
-
- 数据库 · MySQL | 3小时前 | MySQL · 分区 · 数据保留 · mysql 分区表 历史数据清理 RANGE COLUMNS
- MySQL 分区表怎么按日期清理历史数据
- 327浏览 收藏
-
- 数据库 · MySQL | 4小时前 |
- MySQL 事务里 SKIP LOCKED 为什么会跳过未提交任务
- 209浏览 收藏
-
- 数据库 · MySQL | 6小时前 |
- MySQL invisible index 怎么验证索引删除前的影响
- 263浏览 收藏
-
- 数据库 · MySQL | 7小时前 | MySQL · 数据库 · 查询排错 · 递归CTE · mysql WITH RECURSIVE cte_max_recursion_depth CTE 递归查询
- MySQL CTE 递归查询怎么限制层数避免无限展开
- 165浏览 收藏
-
- 数据库 · MySQL | 13小时前 | MySQL · 性能优化 · 执行计划 · mysql 执行计划 慢查询 EXPLAIN ANALYZE
- MySQL EXPLAIN ANALYZE 怎么判断实际行数偏差
- 389浏览 收藏
-
- 数据库 · MySQL | 15小时前 |
- MySQL 窗口函数排序并列时怎么只保留一条结果
- 109浏览 收藏
-
- 数据库 · MySQL | 1天前 | MySQL · SQL · GROUP_CONCAT · mysql group_concat group_concat_max_len
- MySQL GROUP_CONCAT 结果被截断怎么处理
- 470浏览 收藏
-
- 数据库 · MySQL | 1天前 | MySQL · 任务队列 · SKIP LOCKED · 并发消费 ·
- MySQL 多个消费者怎么用 SKIP LOCKED 领取任务
- 184浏览 收藏
-
- 数据库 · MySQL | 1天前 | MySQL · 索引优化 · generated-column · mysql 索引 生成列 计算字段
- MySQL 怎么用生成列保存可索引的计算结果
- 297浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- SuperCLUE
- SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
- 172次使用
-
- C-Eval
- 深入了解C-Eval中文评估套件,涵盖52个学科与4级难度。本文详解其功能特点、Zero-shot/Few-shot使用方法及代码示例,助您全面评测LLM中文理解与泛化能力。
- 102次使用
-
- AI Prompt Library
- 探索AI Prompt Library免费资源库,涵盖营销、写作及多场景AI提示词。兼容ChatGPT、Claude等工具,一键复制优化输出,提升工作效率。
- 26次使用
-
- LangGPT
- LangGPT是一种受编程语言启发的结构化提示词设计工具,提供双层框架、模块化模板及变量功能,帮助用户高效编写高质量Prompt。该项目已在GitHub免费开源,适用于内容创作、编程辅助等多场景。
- 37次使用
-
- ClickPrompt
- ClickPrompt是一款专为AI提示词编写者设计的开源在线工具,支持Stable Diffusion绘图、ChatGPT对话及GitHub Copilot代码辅助。提供Prompt自动生成、一键运行、社区分享及可视化优化功能,帮助用户高效获取精准AI输出。
- 76次使用
-
- MySQL 分区表怎么处理跨分区唯一键:分区列约束与建表取舍
- 2026-08-30 501浏览
-
- MySQL权限管理设置全攻略
- 2026-03-29 501浏览
-
- MySQL分片实现方法及常见方案解析
- 2025-06-24 501浏览
-
- MySQL表空间碎片怎么清理?超详细优化教程
- 2025-06-13 501浏览
-
- MySQL排序性能优化技巧及方法
- 2025-06-04 501浏览

