python pymysql 存储binary数据类型
背景:
对pcap文件进行操作,生成新的pcap文件,为了能够更方便的重现用例,采用mysql进行存储pcap的内容,之后从数据库中读取数据生成pcap文件,进行后续测试。
with open('test.pcap', 'rb') as f:
fp = f.read()
print(fp)
打印的fp内容显示是这样的格式:
# fp \xaa\xcd\x01......
以16进制形式的字节流。
考虑以原本形式储存到数据库中,这样在查询读取后能够直接f.write()生成新的pcap文件。
过程:
mysql支持有binary,varbinary两种binary类型数据存储,目前我是在windows下navicate下存储,打开可视化界面看不到结果,乱码,不过不影响数据库查询到的数据。可能是由于编码问题。
# 连接数据库
# 略过
db = pymysql.connect()
后面说一下在使用时出现的问题,以及使用方式。一开始我是这样写的:为什么这样写,是因为我看的很多对于mysql的连接插入数据基本就是这样写的(狗头)
sql = "INSERT INTO table (data, pcap) VALUES('{}','{}')".format(data, pcap)
cursor = db.cursor()
cursor.execute(sql)
db.commit()
这样执行,数据是插入不进行去,报的是编码问题。后来发现是格式化输入.format()这个函数:
def format(self, *args, **kwargs): # known special case of str.format
"""
S.format(*args, **kwargs) -> str
Return a formatted version of S, using substitutions from args and kwargs.
The substitutions are identified by braces ('{' and '}').
"""
pass
注释第一行 -> str。返回结果是个字符串格式,和设计的数据库字段类型binary不一致。看来.format()这种方式不能进行写入。
目前采用的方法是:
sql = "INSERT INTO table (data, pcap) VALUES(%s, %s)"
cursor.execute(sql, (data, pcap))
execute直接传递参数的形式。
也可能会有类似的waring
Warning: (1300, "Invalid utf8mb4 character string: 'AA'")
更改成:
sql = "INSERT INTO table (data, pcap) VALUES(_binary %s, _binary %s)"
cursor.execute(sql, (data, pcap))
总结:
还是对细节方面把握不好,再接再厉。