You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用LOAD DATA INFILE将完整文件内容存入MySQL字段?

问题描述

我创建了如下数据库表用于存储文本文件内容:

CREATE TABLE Pages
(
ID int(11) unsigned NOT NULL,
Text mediumtext COMPRESSED,
PRIMARY KEY(ID)
) ENGINE=ARIA DEFAULT CHARSET=utf8 COLLATE utf8_general_ci ROW_FORMAT=DYNAMIC

我尝试用LOAD DATA INFILE直接插入单个文件内容,语句如下:

LOAD DATA INFILE 'file.txt' INTO TABLE Pages 
 FIELDS TERMINATED BY '\0' LINES TERMINATED BY '' (Text) 
 SET ID=$id

原本想使用TERMINATED BY '',但触发了报错:

You can't use fixed rowlength with BLOBs; please use 'fields terminated by'

我假设文件中不存在空字符,所以改用了'\0',虽然能正常运行,但有没有更标准的实现方式?

标准实现方案

针对单文件全内容导入的场景,有两种更规范的处理方式:

1. 使用LOAD_FILE()函数

如果是导入单个文件,直接用INSERT结合LOAD_FILE()会更直观,不需要依赖特殊分隔符:

INSERT INTO Pages (ID, Text) 
VALUES ($id, LOAD_FILE('file.txt'));

注意:使用该函数需要确保MySQL的secure_file_priv配置允许读取目标文件路径,同时文件权限要让MySQL进程能够访问。

2. 优化LOAD DATA INFILE的分隔符配置

如果坚持使用LOAD DATA INFILE,可以指定一个几乎不会出现在常规文本中的特殊分隔符,比如ASCII的SUB字符(\x1A),将整个文件内容作为单个字段读取:

LOAD DATA INFILE 'file.txt' INTO TABLE Pages
FIELDS TERMINATED BY '\x1A' LINES TERMINATED BY '\x1A'
(Text)
SET ID=$id;

这种方式比'\0'更稳妥,因为部分文本工具可能会意外插入空字符,而SUB字符在普通文本场景中几乎不会出现。

也可以配合ENCLOSED BY进一步确保内容读取的准确性:

LOAD DATA INFILE 'file.txt' INTO TABLE Pages
FIELDS TERMINATED BY '\x1A' ENCLOSED BY ''
LINES TERMINATED BY '\x1A'
(Text)
SET ID=$id;

内容的提问来源于stack exchange,提问作者Googlebot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 06:55:22