应使用LOAD DATA INFILE配合UNHEX()导入0x开头的十六进制CSV数据到BLOB字段,避免phpMyAdmin默认文本导入导致乱码;需确保字段为BLOB类型、CSV无引号、换行符匹配,并验证HEX(content)与原始字符串一致。
CSV里存的是0x...十六进制字符串,直接导入会变成乱码
phpmyadmin 的 csv 导入功能默认把所有字段当文本处理,不会自动识别并转换 0x 开头的十六进制字符串为二进制数据。如果你导出时用 hex(image_data) 存图,再想用 csv 导回,直接导入只会把 0xffd8ff... 当成普通字符串插进 blob 字段,实际存的是 ascii 字符,不是原始字节。
- 确认源 CSV 中该列内容形如
0xFFD8FFE000104A46494600(以0x开头,后面是偶数位十六进制字符) - 目标字段必须是
BLOB、MEDIUMBLOB或LONGBLOB,不能是VARCHAR或TEXT - phpMyAdmin 本身不支持在导入时执行
UNHEX(),所以得绕过它的 CSV 解析器
用 LOAD DATA INFILE + UNHEX() 手动还原(推荐)
这是最可靠的方式:跳过 phpMyAdmin 的 CSV 表单导入,改用 SQL 直接加载并转换。前提是 MySQL 服务允许 LOCAL INFILE,且你有数据库写权限。
- 确保 CSV 文件已上传到服务器可访问路径(比如
/tmp/data.csv),或启用local_infile=ON并用客户端本地文件 - CSV 中十六进制列不要加引号,否则
UNHEX()会失败;例如写0xFFD8...,...,别写"0xFFD8...",... - 执行类似这样的语句(假设表叫
uploads,十六进制列在 CSV 第2列,对应字段content):
LOAD DATA LOCAL INFILE '/tmp/data.csv' INTO TABLE uploads FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS (id, @hex_content, filename) SET content = UNHEX(@hex_content);
UNHEX() 会把 0x... 自动识别并转为二进制;如果 CSV 里没 0x 前缀(只有纯十六进制字符),就用 UNHEX(@hex_content) 即可;有前缀则必须保留,MySQL 的 UNHEX() 支持它。
导入前用脚本预处理 CSV:把 0x... 替换成 0x... 包裹的 SQL 字面量
如果无法用 LOAD DATA(比如共享主机禁用了 LOCAL INFILE),就得让每条 INSERT 显式调用 UNHEX()。phpMyAdmin 支持导入纯 SQL 文件,所以可以把 CSV 转成带 UNHEX() 的 INSERT 语句。
- 用 Python/PHP/awk 快速处理:读 CSV,对含
0x的字段生成类似UNHEX('0xFFD8FFE0...')的值 - 注意单引号转义:如果原始十六进制字符串里有单引号(极少见,但理论上可能),要替换成两个单引号
- 避免用 Excel 编辑 CSV —— 它会偷偷改编码、加 BOM、转科学计数法,导致
0x消失 - 最终 SQL 文件示例片段:
INSERT INTO uploads (id, content, filename) VALUES
(1, UNHEX('0xFFD8FFE000104A46494600'), 'a.jpg'),
(2, UNHEX('0xFFD8FFE1...'), 'b.jpg');
验证是否真还原成功:别只看 phpMyAdmin 预览
phpMyAdmin 在列表页显示 BLOB 字段时,通常只显示前几十字节的十六进制摘要(比如 0xffd8ff...),看起来“像”是对的,但其实可能是原始字符串的 hex 展示 —— 你得确认底层字节和原始文件一致。
- 用命令行验证:
SELECT HEX(content) FROM uploads WHERE id = 1;,结果应和 CSV 里那串完全一致(不含0x前缀) - 更准的方法:导出该字段为文件,用
xxd或file命令检查:mysql -N -s -e "SELECT content FROM uploads WHERE id=1" > out.jpg && file out.jpg - 常见翻车点:CSV 用了 Windows 换行(
\r\n)但LOAD DATA指定LINES TERMINATED BY '\n',导致最后一列错位,UNHEX()收到带\r的字符串而失败
真正难的不是转换动作,而是确保十六进制字符串从导出、保存、传输到导入全程没被任何环节截断、转义或重新编码 —— 尤其是换行符、BOM、Excel 自作聪明的格式化。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










