You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

查询返回的VARBINARY字符串长度远短于实际值,求原因

问题

我用VARBINARY(MAX)类型存储图片的二进制数据(存储格式为0xFFD8FFE0......这类十六进制字符串形式),查询后遇到异常:用PHP代码查询该字段并调用strlen()获取长度为26633,但直接从表中复制该字符串后调用strlen()得到的长度是53268。

代码示例:

$data = DB::select("
SELECT photo_string
FROM users_photos
WHERE user_id = 123
");

echo(strlen($data[0]->photo_string)); // 输出26633
原因分析

这是两种场景下拿到的字符串本质完全不同导致的:

  • PHP代码查询返回的photo_string是二进制原始数据:VARBINARY类型存储的是二进制字节流,PHP查询后直接拿到的是图片的原始二进制内容,strlen()统计的是实际字节数,26633就是图片真实的文件大小。
  • 直接从表中复制的是十六进制文本字符串:数据库界面显示的0xFFD8FFE0......是二进制数据的十六进制可视化形式,每1个二进制字节会被转换成2个十六进制字符(比如字节0xFF会变成字符串"FF"),所以长度刚好是原始二进制的2倍,53268=26633×2,完全对应。
解决思路

如果要把查询到的数据转回图片,直接用二进制原始内容即可:

// 直接输出图片到浏览器
header('Content-Type: image/jpeg');
echo $data[0]->photo_string;

// 或者保存为本地图片文件
file_put_contents('user_photo.jpg', $data[0]->photo_string);

如果拿到的是从表中复制的十六进制文本字符串,需要先转成二进制再处理:

$hex_str = '0xFFD8FFE0......'; // 从表中复制的字符串
// 去掉前缀0x(如果存在),再转成二进制
$binary_data = hex2bin(ltrim($hex_str, '0x'));
echo strlen($binary_data); // 此时会输出26633

内容的提问来源于stack exchange,提问作者pileup

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 22:30:27