当前位置:首页 > 文章列表 > 数据库 > MySQL > MySQL LOAD DATA 导入带引号换行的 CSV 怎么设置

MySQL LOAD DATA 导入带引号换行的 CSV 怎么设置

来源:17golang原创 2026-09-07 14:46:31 0浏览 收藏

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,"华南仓库","含有逗号,仍是一个字段"
MySQL LOAD DATA 将 CSV 文件、字段分隔符、双引号包围符和行结束符对应到目标表的三层边界关系图
图1:CSV 文件的字段与记录边界,需要分别对应 LOAD DATA 的字段和行参数。

对应关系可以记成:逗号属于字段边界,双引号属于字段包围规则,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 本身就能按包围符规则识别;只有当上游确实用某个字符做转义前缀时,才让该参数匹配上游。

MySQL CSV 字段内逗号、双引号包围符、成对双引号和 ESCAPED BY 的静态数据结构关系图
图2:字段内逗号和双引号是否属于数据,取决于包围符与转义约定的组合。

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 说明还特别提醒,FIELDSLINES 的格式必须和生成文件时一致。把这条规则写进导入脚本旁边的注释或 README,下一次换导出工具时就能及时发现格式变化。

常见问题

不写 FIELDS 和 LINES 时,MySQL 默认按什么解析?

默认字段分隔符是制表符,记录结束符是换行,也不默认使用包围符;普通逗号 CSV 不能直接依赖默认值。

OPTIONALLY ENCLOSED BY 能解决字段内换行吗?

不能。它不是换行开关,换行归 LINES TERMINATED BY 管;输入时是否剥离包围符也不因 OPTIONALLY 改变。

为什么只改 TERMINATED BY 还是会错列?

因为字段里有逗号时,必须同时告诉 MySQL 双引号是包围符;如果字段里还有双引号,还要继续匹配上游的成对引号或转义字符约定。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Go crypto/sha256 怎么边读文件边计算校验值Go crypto/sha256 怎么边读文件边计算校验值
上一篇
Go crypto/sha256 怎么边读文件边计算校验值
Go GOPROXY 设置为 off 后为什么新依赖下载失败
下一篇
Go GOPROXY 设置为 off 后为什么新依赖下载失败
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • SuperCLUE中文大模型评测基准:功能、能力维度与应用指南
    SuperCLUE
    SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
    172次使用
  • C-Eval中文评测基准:大语言模型多学科能力评估指南
    C-Eval
    深入了解C-Eval中文评估套件,涵盖52个学科与4级难度。本文详解其功能特点、Zero-shot/Few-shot使用方法及代码示例,助您全面评测LLM中文理解与泛化能力。
    102次使用
  • AI Prompt Library:免费AI提示词库,助力ChatGPT高效创作与营销
    AI Prompt Library
    探索AI Prompt Library免费资源库,涵盖营销、写作及多场景AI提示词。兼容ChatGPT、Claude等工具,一键复制优化输出,提升工作效率。
    26次使用
  • LangGPT提示词框架:结构化Prompt设计方法与开源工具指南
    LangGPT
    LangGPT是一种受编程语言启发的结构化提示词设计工具,提供双层框架、模块化模板及变量功能,帮助用户高效编写高质量Prompt。该项目已在GitHub免费开源,适用于内容创作、编程辅助等多场景。
    37次使用
  • ClickPrompt:AI提示词生成与优化工具,支持Stable Diffusion、ChatGPT及代码辅助
    ClickPrompt
    ClickPrompt是一款专为AI提示词编写者设计的开源在线工具,支持Stable Diffusion绘图、ChatGPT对话及GitHub Copilot代码辅助。提供Prompt自动生成、一键运行、社区分享及可视化优化功能,帮助用户高效获取精准AI输出。
    76次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码