python pymysql 存储binary数据类型

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))

总结:
还是对细节方面把握不好,再接再厉。

你可能感兴趣的:(mysql,python)