查询返回的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
相关产品推荐
相关产品推荐

