导出BLOB字段需启用十六进制模式:在phpMyAdmin自定义SQL导出中,展开“格式特定选项”并勾选“以十六进制格式转储BLOB字段”,否则非文本内容会变空或乱码;mysqldump对应参数为--hex-blob。

导出时BLOB字段显示为空或乱码?先确认是否启用了十六进制模式
phpMyAdmin 默认对 BLOB 字段采用“可读字符串”方式导出(即尝试 UTF-8 解码),一旦内容非文本(如图片、加密数据、二进制协议包),就会变成空值、问号或截断。强制十六进制是唯一能无损保留原始字节的方式,但这个选项**不在导出界面显眼位置**,也不随“格式选择”自动生效。
导出前必须勾选“以十六进制格式转储 BLOB 字段”
该选项位于导出页面的「格式特定选项」区域,仅在选择 SQL 格式时出现(CSV、JSON 等不支持)。常见遗漏点:用户选了 Custom 导出模式却没展开「格式特定选项」折叠块,或误以为勾选了「保存为文件」就已启用。
- 进入表页 → 点击「导出」标签页
- 选择「自定义」导出方式 → 格式选
SQL - 向下滚动,找到「格式特定选项」→ 展开它
- 勾选
以十六进制格式转储 BLOB 字段(英文版为Hex dump BLOB data) - 导出生成的 SQL 中,
BLOB值会变成类似0x89504E470D0A1A0A...的形式
用 mysqldump 替代 phpMyAdmin 时对应参数是 --hex-blob
当 phpMyAdmin 导出失败或需脚本化时,直接调用命令行更可靠。注意:--hex-blob 是 mysqldump 的独立开关,不依赖字符集设置,且对所有 BLOB 类型(TINYBLOB、MEDIUMBLOB、LONGBLOB)统一生效。
- 基础命令:
mysqldump -u user -p --hex-blob database_name table_name > dump.sql - 若只导出部分列,确保含 BLOB 列的 SELECT 语句也加
HEX()函数包裹(如SELECT id, HEX(image_data) FROM photos),否则导出仍是原始二进制 - phpMyAdmin 底层其实也调用 mysqldump(当启用时),但 Web 界面隐藏了参数传递细节,容易误判行为一致性
导入时无需额外操作,MySQL 自动识别 0x 前缀
只要导出 SQL 文件里 BLOB 值以 0x 开头(如 0xFFD8FFE0),MySQL 在执行 INSERT 或 LOAD DATA 时会原样还原为二进制字节——不需要手动调用 UNHEX(),也不受客户端连接字符集影响。
立即学习“PHP免费学习笔记(深入)”;
- 验证方法:导入后执行
SELECT LENGTH(blob_column), HEX(blob_column) FROM t LIMIT 1;,长度应与原始一致,HEX 结果应与导出文件中完全匹配 - 常见陷阱:用文本编辑器手动修改导出 SQL 时删掉了
0x前缀,导致导入变成字符串插入,实际存入的是 ASCII 字符 '0' 'x' 开头的文本 - 如果导出的是单个 BLOB 字段(非完整表),而你打算用
INSERT ... VALUES (0x...)手动插入,请确保目标列类型确实是BLOB或VARBINARY,而非VARCHAR



















