Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可能损坏sqlite数据库?_Sqlite_Corruption_Corrupt_Data Corruption - Fatal编程技术网

可能损坏sqlite数据库?

可能损坏sqlite数据库?,sqlite,corruption,corrupt,data-corruption,Sqlite,Corruption,Corrupt,Data Corruption,我也是。我注意到一个问题,当尝试使用uid列选择歌曲时,它不会返回任何行;例如: SELECT * FROM songs WHERE uid = 'yzoiaVuicn5ISq1+4DaKGbM3trht/z/ONNm+vA==' 即使存在具有给定uid的行。将“=”替换为“LIKE”将返回正确的行 我已经能够使用以下方法修复它: UPDATE songs SET uid = uid || '' 这是数据库损坏的典型案例吗?或者可能是sqlite错误?这是怎么发生的?我不认为这是腐败的迹象,

我也是。我注意到一个问题,当尝试使用uid列选择歌曲时,它不会返回任何行;例如:

SELECT * FROM songs WHERE uid = 'yzoiaVuicn5ISq1+4DaKGbM3trht/z/ONNm+vA=='
即使存在具有给定uid的行。将“=”替换为“LIKE”将返回正确的行

我已经能够使用以下方法修复它:

UPDATE songs SET uid = uid || ''

这是数据库损坏的典型案例吗?或者可能是sqlite错误?这是怎么发生的?

我不认为这是腐败的迹象,而是如何处理的

例如,请考虑以下几点:-

SELECT uid, 
    TRIM(uid) = 'yzoiaVuicn5ISq1+4DaKGbM3trht/z/ONNm+vA==' AS trim1match,
    TRIM(uid) = TRIM('yzoiaVuicn5ISq1+4DaKGbM3trht/z/ONNm+vA==') AS trimbothmatch,
    CAST(uid AS TEXT) = 'yzoiaVuicn5ISq1+4DaKGbM3trht/z/ONNm+vA==' AS casttotextmatch,
    'yzoiaVuicn5ISq1+4DaKGbM3trht/z/ONNm+vA==' LIKE(uid) AS likematch,
    'yzoiaVuicn5ISq1+4DaKGbM3trht/z/ONNm+vA==' = uid AS reversematch
FROM songs 
WHERE trim(uid) = 'yzoiaVuicn5ISq1+4DaKGbM3trht/z/ONNm+vA=='
WHERE
子句使用TRIM(uid)选择适当的行。结果输出为:-

  • 注意,
    'yzoiaVuicn5ISq1+4DaKGbM3trht/z/ONNm+vA='=uid AS reversematch
    返回false,但所有其他比较返回1,即true,因此为匹配
问题(uid存储为BLOB) 问题是,uid列的存储类为BLOB,因此类型亲和力为BLOB。这可以通过使用typeof功能添加提取列/行类型的列来看出,例如:-

SELECT uid, typeof(uid),
    trim(uid) = 'yzoiaVuicn5ISq1+4DaKGbM3trht/z/ONNm+vA==' AS trim1match,
    trim(uid) = trim('yzoiaVuicn5ISq1+4DaKGbM3trht/z/ONNm+vA==') AS trimbothmatch,
    CAST(uid AS TEXT) = 'yzoiaVuicn5ISq1+4DaKGbM3trht/z/ONNm+vA==' AS casttotextmatch,
    'yzoiaVuicn5ISq1+4DaKGbM3trht/z/ONNm+vA==' LIKE(uid) AS likematch,
    'yzoiaVuicn5ISq1+4DaKGbM3trht/z/ONNm+vA==' = uid AS reversematch
FROM songs 
WHERE trim(uid) = 'yzoiaVuicn5ISq1+4DaKGbM3trht/z/ONNm+vA=='
结果:-

因此,将列显式(CAST)或隐式(TRIM等某些函数)转换为文本类型可以解决此问题。请注意,SUBSTR从BLOB返回字节,因此不会转换列类型,因此
SUBSTR(uid,1)
不起作用


注意

运行上述减去where子句表示某些行的uid列具有列类型的文本,如下所示:-


这里确实需要更多信息。您的表模式是什么?你的uid列有什么?如果是其他类型的值,那么实际存储在其中的值是什么类型的?没有这些,我们只能猜测。也许uid是一个blob而不是一个文本值?@Shawn您可以从公开的SQLite数据库获取所有信息。我会回答你的问题,但我已经得到了一个解决我的问题的答案(如下),其中包含了你一直要求的信息。你说得对文本。谢谢。非常感谢您提供的信息丰富且有用的答案。我不知道string/blob是SQLite中的一种东西。我一直在使用Qt的quid和casting to string生成一些UID,而blob是通过base64编码一个hash创建的,我将其作为QByteArray传递。我相信把它放在弦上会解决我的问题。