如何用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
相关产品推荐
相关产品推荐

