无法从带有意外字符的 sqlite3 文件中检索数据

Posted

技术标签:

【中文标题】无法从带有意外字符的 sqlite3 文件中检索数据【英文标题】:Can't retrieve data from sqlite3 file with unexpected characters 【发布时间】:2020-09-09 16:43:25 【问题描述】:

我有 sqlite3 数据库文件,我正在尝试从中获取数据。当我尝试在 sqliteBrowser 中打开它时,它会生成表,但它会忽略文件中的数据,所以我得到空表。这是文件:localData.sqlite

我不知道文件是否格式错误,或者我是否缺少某些功能,我必须运行它。

该文件是由第三方应用程序在 Windows 上使用以下代码创建的。

文件创建

        
            try
            
                if (!File.Exists("queueData.sqlite"))
                
                    SQLiteConnection.CreateFile("queueData.sqlite");
                

                using (SQLiteConnection c = new SQLiteConnection(connection))
                
                    c.Open();
                    using (SQLiteCommand cmd = new SQLiteCommand("create table if not exists vehicles (data TEXT)", c))
                    
                        cmd.ExecuteNonQuery();
                    
                    using (SQLiteCommand cmd = new SQLiteCommand("create table if not exists vehiclesMQTT (data TEXT)", c))
                    
                        cmd.ExecuteNonQuery();
                    
                    using (SQLiteCommand cmd = new SQLiteCommand("create table if not exists faces (data TEXT)", c))
                    
                        cmd.ExecuteNonQuery();
                    
                    using (SQLiteCommand cmd = new SQLiteCommand("create table if not exists facesMQTT (data TEXT)", c))
                    
                        cmd.ExecuteNonQuery();
                    
                    c.Close();
                
            
            catch (Exception ex)
            
                AdLogsManager.instance.writeErrorMessage("Creating DB and Table: " + ex.Message,"", "", 7001);
            
        

数据插入

        
            try
            
                var tableName = getTableNameByType(type);
                string sql = "insert into " + tableName + " (data) values (\'" + data + "\')";
                using (SQLiteConnection c = new SQLiteConnection(connection))
                
                    c.Open();
                    using (SQLiteCommand cmd = new SQLiteCommand(sql, c))
                    
                        cmd.ExecuteNonQuery();
                    
                    c.Close();
                
                return true;
            
            catch (Exception ex)
            
                AdLogsManager.instance.writeErrorMessage("Saving data: " + ex.Message,"", "", 7002);
                return false;
            
        

如果有人可以帮助我解决问题或找到获取数据的方法,我将不胜感激。

谢谢。

【问题讨论】:

您的 sqlite 数据库已损坏,无法识别 - 那里有 4 个空表。没有办法得到任何有用的东西。寻找备份。 我没有备份。第三方应用程序以这种方式存储数据。有没有办法可以向文件中添加一些额外的指令或编写脚本来从中获取数据? 我在您的数据库上使用了工具 undark,但实际上,您的数据是 fubared 是的,应用程序中的某些内容正在破坏记录。将继续检查。谢谢! 【参考方案1】:

没有任何保证!

您的数据库已损坏,或者不知何故,记录已被删除。

但是,您仍然可以在文本编辑器中打开文件并看到很多记录,例如:

..."channel":"app-emit","payload":"type":"vehicle","deviceId":"d4f9bb04b6d5","time":1595510864502,"appName":"vehicle","appVersion":"1.0.1","data":"count":1,"speed":0.0,"zoneId":"inbound","time":1595510864502...

我不知道它们属于哪个表,也不知道它们是真实的还是过时的,甚至不知道丢失了多少。

使用这种方法,可以恢复4087条记录:https://justpaste.it/38j03

进一步了解您的应用程序应该有助于您评估它们是否有用。

编辑:使用的方法:

我使用十六进制/文本编辑器 (MadEdit) 来:

    "channel": 之前放置一个中断(将十六进制 7B226368616E6E656C223A 替换为 0A7B226368616E6E656C223A) 在 之后放置一个中断(将十六进制 7D7D7D 替换为 7D7D7D0A) 删除了每次出现的 null(将十六进制 00 替换为空)

然后将粘贴的所有内容复制到电子表格应用程序 (Excel) 中,以便进行一些排序和过滤。

更好的方法:在 Word 中打开,进行相同的替换("channel":^p"channel":^p),然后粘贴到 Excel。

【讨论】:

是的,我认为应用程序中的某些内容有问题并且正在损坏文件。但是谢谢!这非常有帮助,谢谢!我需要对其他几个文件做同样的事情。您能否与我分享方法以及您是如何恢复的,以便我可以重复该过程?再次感谢您!

以上是关于无法从带有意外字符的 sqlite3 文件中检索数据的主要内容,如果未能解决你的问题,请参考以下文章

从 sqlite3 检索图像并在 Kivy 图像小部件中显示 - ValueError

带有重音的xcode sql字符已更改

限制输入 SQLite3 的字符数

使用 Java 从 HDF5 文件中的 NetCDF 字符数组变量中检索一维数组

如何从字典中检索数组

带有 AngularJS 的 Windows Phone 8.1 上的 Phonegap 无法从我的 API 中检索 JSONP