BLOB导出乱码或为空,是因phpMyAdmin默认用文本模式渲染,须在浏览时点击Hex按钮切换为十六进制显示,再配合SQL格式导出并勾选Hexadecimal;CSV/JSON等格式不支持该选项,大BLOB还需调高PHP和phpMyAdmin内存及超时限制,或改用mysqldump --hex-blob命令行导出。
导出时BLOB变成乱码或空值,是因为没启用十六进制显示
phpmyadmin 默认对 blob 字段使用“文本模式”渲染,遇到非 utf-8 或不可见字节就会截断、替换或显示为空。真正想保留原始字节,必须强制走十六进制路径——这不是导出设置问题,而是**浏览阶段就要切换显示模式**。
操作路径:打开表 → 点击某条含 BLOB 的记录 → 在字段值右侧找到小图标(通常是 … 或 Hex 按钮)→ 点击它,字段内容会立刻转为 0x474946383961... 格式。只有这时,后续导出才可能带十六进制标记。
- 没点这个按钮就直接导出,哪怕选了“以十六进制导出”,实际仍是按原始二进制流处理,Excel 或文本编辑器打不开
- 该按钮只对当前行生效,批量导出前需确认每行
BLOB都已手动切换为 Hex 视图 - 如果字段类型是
TINYBLOB/MEDIUMBLOB/LONGBLOB,行为一致;但TEXT类型不会出现此按钮,别混淆
导出页面里“十六进制”复选框不起作用的真相
phpMyAdmin 导出页(Export 标签页)有个 Hexadecimal 复选框,但它**只影响 INSERT 语句中的 VALUES 部分**,且仅当导出格式为 SQL 时生效。如果你选的是 CSV、JSON 或 Excel,这个选项完全被忽略。
所以常见错误是:勾了 Hexadecimal,导出 CSV 后打开全是空或乱码——因为 CSV 不支持 0x... 语法,phpMyAdmin 直接跳过转换,写入原始二进制(被系统当作损坏文件)。
- 要得到可读十六进制字符串,必须选
SQL格式 + 勾选Hexadecimal+ 确保浏览时已切换为 Hex 视图 - 导出 SQL 时,生成的语句类似:
INSERT INTO `table` VALUES (0x474946383961...),这才是标准十六进制标记 - 若用
JSON格式,即使字段是 Hex 显示,导出仍为 base64 编码字符串(如"R0lGODlh"),不是十六进制
大 BLOB 导出失败或超时,得调 phpMyAdmin 和 PHP 底层限制
十六进制字符串长度是原始数据的两倍(1 字节 → 2 字符),加上 SQL 包裹,导出 1MB 的 BLOB 可能生成 3MB+ 的 0x... 字符串。phpMyAdmin 默认内存和执行时间扛不住。
立即学习“PHP免费学习笔记(深入)”;
关键配置项要一起改:
-
php.ini中调大:memory_limit(建议 ≥256M)、max_execution_time(≥300)、post_max_size和upload_max_filesize(≥32M) - phpMyAdmin 配置文件
config.inc.php加:$cfg['MemoryLimit'] = -1;(禁用内部内存限制) - 导出前在 phpMyAdmin 右上角点击
Settings→Export→ 把Max rows to export设为具体数字(比如 100),避免一次拉全表
用命令行 mysqldump 绕过 phpMyAdmin 界面更可靠
界面导出不稳定,尤其对大 BLOB 或特殊字符,不如直接用 mysqldump。它原生支持十六进制输出,且不依赖浏览器渲染状态。
示例命令:
mysqldump --hex-blob --skip-extended-insert -u root -p database_name table_name > dump.sql
说明:
-
--hex-blob是核心参数,让TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB全部转成0x... -
--skip-extended-insert避免单条超长 INSERT,方便查看和调试 - 不加
--compatible=ansi等参数,否则可能禁用十六进制语法 - 导出文件可直接用
vim或less查看十六进制部分,比 phpMyAdmin 更直观
复杂点在于:你得有服务器 SSH 权限,且 mysqldump 版本不能太老(5.5+ 支持完整 --hex-blob)。界面导出省事但容易掉坑,命令行慢一点但字节不丢。



















