MySQL LOAD DATA 导入含换行文本时如何配置字段包围符
用 LOAD DATA 导入 CSV 时,如果备注、描述或日志列本身包含真实换行,最容易出现的现象是:一条记录被读成两条,后续列全部错位。处理重点不是单独把换行符“转义”,而是让 MySQL 同时知道字段在哪里开始、在哪里结束,以及文件的一行实际由什么字符结束。
官方文档:https://dev.mysql.com/doc/refman/8.4/en/load-data.html
对于逗号分隔、文本字段用双引号包围的文件,通常使用FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"',再按文件实际格式设置LINES TERMINATED BY '\n'或'\r\n'。包围符把换行纳入字段内容,行终止符只负责识别包围范围之外的记录边界。
ENCLOSED BY决定字段包围字符,含换行的字段必须有清晰的包围边界。OPTIONALLY主要影响输出格式;读取输入时,包围符本身仍会参与字段识别。- 文件来自 Windows、Linux 或导出工具时,先确认是 CRLF 还是 LF,再处理转义符和字符集。
字段包围符为什么能容纳换行内容
假设文件的两列是编号和备注,第二列允许多行文本:
1001,"第一行备注
第二行备注"
1002,"没有换行的备注"
这里的逗号是字段分隔符,双引号是字段包围符,第一条记录中的换行位于一对双引号之内。MySQL 的输入解析会把包围字段中的换行当作当前字段内容;只有遇到包围范围外的行终止符,才形成新的记录边界。

因此,单纯把 LINES TERMINATED BY 改成其他字符并不能解决问题;如果字段没有可靠的包围符,解析器仍无法判断某个换行属于字段内容还是新记录。
先对齐分隔符、包围符和换行符
一个适合上述文件的最小写法如下。示例假定文件使用 UTF-8、逗号分隔、双引号包围字段,并且每条记录以 Linux 风格 LF 结束:
LOAD DATA LOCAL INFILE '/data/notes.csv'
INTO TABLE import_notes
CHARACTER SET utf8mb4
-- 逗号只在包围字段之外承担列分隔职责
FIELDS TERMINATED BY ','
-- 双引号包住可能出现逗号或换行的文本列
OPTIONALLY ENCLOSED BY '"'
-- 保留默认反斜杠转义语义,除非生产方另有约定
ESCAPED BY '\\'
-- 文件若来自 Windows,应改成 '\\r\\n'
LINES TERMINATED BY '\\n';
| 参数 | 解决的问题 | 常见判断 |
|---|---|---|
FIELDS TERMINATED BY | 字段之间如何分列 | CSV 通常是逗号,制表文本通常是 \t |
[OPTIONALLY] ENCLOSED BY | 哪些字符包住字段值 | 常见是双引号,且必须是单个字符 |
ESCAPED BY | 引号、反斜杠等特殊字符如何表示 | 先与导出方约定,不要盲改为空字符串 |
LINES TERMINATED BY | 包围字段之外的记录边界 | LF 与 CRLF 不要混淆 |
OPTIONALLY 不要理解成“输入时可有可无、因此可以不写”。在读取输入时,MySQL 仍会根据 ENCLOSED BY 判断字段边界;OPTIONALLY 对输入解释没有改变。它更容易在导出和回读场景中造成误解。

引号和空值要按文件生产规则处理
字段值中如果还包含双引号,不能只看表面字符。MySQL 文档说明,包围符前有转义字符时会被当作字段内容;包围符也可以在输入中成对出现并还原为一个字符。生产方若采用反斜杠转义,就保留默认的 ESCAPED BY '\\';若明确采用 CSV 风格的成对双引号,应让导入规则与生成规则保持一致,别在没有样本的情况下随意把转义符设为空。
更稳妥的方式是先把原始字段接到用户变量,再做清洗。例如目标表有导入时间,而文件中只有编号和备注:
LOAD DATA LOCAL INFILE '/data/notes.csv'
INTO TABLE import_notes
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '\\'
LINES TERMINATED BY '\\n'
-- 先接住原始文本,避免直接把脏值写入最终列
(@raw_id, @raw_note)
-- 用 SET 统一空串与目标列转换规则
SET note_id = NULLIF(@raw_id, ''),
note_text = @raw_note,
imported_at = CURRENT_TIMESTAMP;
这里的 NULLIF 只把空字符串转换为 NULL,不会把含换行的备注截断。若文件使用 MySQL 约定的 \N 表示 NULL,还应把该规则与生产方的导出格式一起确认。
导入异常时先查这份边界清单
- 每行都错位:检查
FIELDS TERMINATED BY是否真的等于文件分隔符。 - 含换行字段被拆开:确认文本是否从字段开头就有包围符,且包围符成对出现。
- 最后一列多出回车:Windows 文件尝试
LINES TERMINATED BY '\r\n',不要只改字段分隔符。 - 中文乱码:检查文件字符集与
CHARACTER SET utf8mb4,这与字段包围符是两件事。 - 引号内容异常:对照导出方的转义方式,重点看双引号是否反斜杠转义或成对转义。
生产导入建议先落到临时表,抽查包含逗号、双引号和真实换行的样本,再把字段映射到正式表。只要字段包围规则、行终止符和转义规则来自同一份文件约定,LOAD DATA 就能把多行文本作为一个字段稳定读入。
相关问题
OPTIONALLY ENCLOSED BY 能否省略?
语法上可以省略 OPTIONALLY,但不能省略字段包围字符的设计。输入文件中存在带逗号或换行的文本时,明确写出包围符更容易核对规则。
文件是 CRLF 时只写 LINES TERMINATED BY '\n' 可以吗?
不建议凭经验处理。应以文件真实字节为准;若回车残留在最后一列,优先改为 '\r\n' 并重新抽样。
为什么把 ESCAPED BY 设为空后更容易错位?
因为字段里的包围符、行终止符或字段分隔符可能失去明确的转义方式,读取器会把本应属于值的字符当成结构边界。
Go filepath.WalkDir 遇到权限错误时如何继续其他目录
- 上一篇
- Go filepath.WalkDir 遇到权限错误时如何继续其他目录
- 下一篇
- Go build tags 多个条件组合时为什么文件没被选中
-
- 数据库 · MySQL | 43分钟前 |
- MySQL LOCK INSTANCE FOR BACKUP 怎样协调备份窗口
- 163浏览 收藏
-
- 数据库 · MySQL | 46分钟前 |
- MySQL CTE 怎样写递归组织结构查询
- 164浏览 收藏
-
- 数据库 · MySQL | 48分钟前 |
- MySQL JSON_OVERLAPS 怎样判断两个 JSON 是否有交集
- 341浏览 收藏
-
- 数据库 · MySQL | 49分钟前 |
- MySQL JSON_SCHEMA_VALIDATION_REPORT 怎样定位校验失败字段
- 391浏览 收藏
-
- 数据库 · MySQL | 53分钟前 |
- MySQL TABLE 语句怎样直接读取整张表
- 260浏览 收藏
-
- 数据库 · MySQL | 56分钟前 | MySQL · 数据库 · SQL · mysql INTERSECT 集合查询 INTERSECT ALL
- MySQL INTERSECT 怎样找出两组查询的共同记录
- 323浏览 收藏
-
- 数据库 · MySQL | 59分钟前 | mysql except EXCEPT ALL 集合查询
- MySQL EXCEPT 怎样排除另一查询的结果行
- 478浏览 收藏
-
- 数据库 · MySQL | 11小时前 | MySQL ·
- MySQL 外键迁移的检查开关与恢复顺序
- 318浏览 收藏
-
- 数据库 · MySQL | 19小时前 |
- MySQL 事件调度器怎样安全执行周期任务
- 159浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 718次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 724次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 801次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 761次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 594次使用
-
- MySQL 明明加了索引,为什么查询还是很慢?先查这 6 个点
- 2026-06-27 374浏览
-
- golang MySQL实现对数据库表存储获取操作示例
- 2022-12-22 499浏览
-
- golang 基于 mysql 简单实现分布式读写锁
- 2023-01-07 384浏览
-
- 详解如何利用GORM实现MySQL事务
- 2023-01-07 184浏览
-
- Go语言实现操作MySQL的基础知识总结
- 2023-01-23 265浏览

