我正在做一个处理数据库损坏的任务,所以我已经通过了sqlite的How to corrupt an SQLite databaseHow to verify if a database file is valid/consistent
但我有更具体的问题,这可能也有助于其他人。布尔值答案可以
如果一个sqlite数据库文件损坏了,我能打开它吗?有时还是总是?
如果answer1是yes,并且我打开它,读/写操作是否会使我的应用程序崩溃,或者只是返回可以处理的错误?
如果发生损坏,我下面的(下一步)读/写是否可以成功,或者每次读/写都将返回错误?
在成功创建和关闭数据库文件之后,我是否可以使用md5sum来检测下一次打开文件时的任何损坏,前提是我要避免quick_checkintegrity_check因为它们速度较慢?

最佳答案

损坏数据的本质是,除非您运行一个彻底的验证过程,否则所有赌注都将被取消。任何事情都有可能发生。猪能飞。谁知道呢。
回答您的问题:
有时候,是的。由于sqlite在您打开数据库时不会验证整个数据库,因此它无法知道文件已损坏,除非它在打开时碰巧读取损坏的数据。
最有可能的崩溃操作将崩溃的方式,你可以处理。如果SQLite中有可利用的bug,比如缓冲区溢出错误或类似的,那么所有的赌注都被关闭,但是没有迹象表明这些东西存在。
有的可以工作,有的可能失败,没有办法事先知道。
无法使用MD5检测损坏的SQLite数据库。首先,正确的md5值应该是什么?唯一的方法是从文件中计算它,这也是您要验证的。
简而言之,由于没有定期执行pragma integrity_check;,您无法保证sqlite将如何处理损坏的数据库。
举个例子,如果损坏发生使数据库看起来有效,除了它不再包含用户存储在其中的原始数据之外,该怎么办?

07-27 19:17