Python如何将被识别为UTF-8的字符串无损转为二进制数据?
解决Firebird String类型BLOB二进制数据的无损获取问题
核心问题说明
Firebird数据库用String类型BLOB存储二进制数据时,firebirdsql驱动会将其解码为Python字符串,导致打印时不可打印的控制字符被隐藏,且你需要还原原始二进制数据且不修改内容。
解决步骤
1. 确认数据并未丢失
单独打印x[1]时看不到\x00、\x01等字符,是终端默认不显示不可打印控制字符导致的,并非数据丢失。你可以用repr()查看字符串的完整原始内容:
print(repr(x[1]))
输出会和print(x)时显示的转义内容完全一致。
2. 无损将字符串转为二进制bytes
要把字符串还原为原始二进制数据,唯一无损的方式是使用latin-1编码——因为Latin-1是单字节编码,每个Unicode字符(U+0000到U+00FF)和字节(0x00到0xFF)一一对应,编码过程不会修改任何原始字节:
original_binary = x[1].encode('latin-1')
此时original_binary就是和数据库中存储的完全一致的二进制数据,验证方式:
print(repr(original_binary))
输出会和print(x)中显示的字符串转义内容匹配(仅前缀多了b')。
3. 从根源避免转换(推荐)
如果firebirdsql驱动支持,你可以在连接或查询时指定让String类型BLOB直接返回bytes,跳过解码为字符串的步骤。比如检查驱动的连接参数,是否有类似charset=None或者blob_type=bytes的配置,具体可查看驱动参数说明。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

