导出时二进制字段变乱码或NULL,是因为phpMyAdmin默认对BLOB等字段做可读化处理,须改用CSV/JSON格式并正确配置分隔符或启用Base64编码,大体积数据应优先使用mysqldump --hex-blob命令行导出。
导出时二进制字段变成乱码或NULL怎么办
phpmyadmin 默认对 blob、bit、tinyblob 等二进制类型字段做“可读化处理”,比如转成十六进制字符串或截断显示,导出时若选错格式,实际内容就丢了——不是数据损坏,而是导出逻辑跳过了原始字节流。
关键在导出前切换「导出方式」和「格式选项」,而非依赖默认的 SQL 或 CSV。
- 必须选择
CSV或JSON格式(SQL格式会把BLOB转成0x...十六进制字面量,还原麻烦) - 勾选
包含列名称和使用引号包裹字段(防止换行、逗号破坏结构) - 特别注意:在
CSV导出设置里,把字段分隔符改为非打印字符,比如\t(制表符)或0x01(ASCII SOH),避免二进制数据里恰好含逗号或双引号导致解析错位
用 JSON 导出二进制字段的实操要点
JSON 格式对二进制更友好,phpMyAdmin 会自动将 BLOB 字段编码为 Base64 字符串(如 "data": "aGVsbG8="),保留完整字节,且无需手动处理分隔符冲突。
但要注意几个细节:
- 导出前确认 phpMyAdmin 版本 ≥ 5.2 —— 更早版本可能把
BLOB当空字符串处理 - 不要勾选
压缩输出(gzip),某些客户端解析 Base64 前会先解压,导致 Base64 字符串被破坏 - 如果字段值极大(如 >10MB),浏览器可能卡死或内存溢出;此时应改用命令行工具
mysqldump配合--hex-blob或--skip-extended-insert
导出后如何还原二进制数据
导出本身只是序列化,还原得靠下游处理。比如 CSV 中的 Base64 字段,不能直接插入 MySQL,需先解码:
立即学习“PHP免费学习笔记(深入)”;
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
INSERT INTO t (id, img) VALUES (1, FROM_BASE64('aGVsbG8='));
而 JSON 导出的数据,需用对应语言解码:
- PHP:
base64_decode($json['img']) - Python:
base64.b64decode(data['img']) - MySQL 命令行导入 JSON 文件?不行——MySQL 不支持直接从 JSON 文件还原 BLOB,得写脚本或用
LOAD DATA INFILE+ 自定义处理
真正安全的方案:绕过 phpMyAdmin 直接用 mysqldump
当数据量大、字段多或要求 100% 字节保真时,phpMyAdmin 的 Web 界面本质是瓶颈。最稳的方式是服务端执行:
mysqldump --user=root --password --hex-blob --no-create-info database table > data.sql
--hex-blob 把所有二进制字段转成 0x48656C6C6F 形式,导入时 MySQL 自动识别;--no-create-info 可避免建表语句干扰。如果目标环境没 shell 权限,那只能退回 JSON + Base64,并严格校验首尾长度是否匹配原始 LENGTH(blob_col)。
Base64 编码膨胀约 33%,且中间任意一个字符损毁都会导致整块数据无法还原——这比十六进制更脆弱,别省略校验步骤。


















