可能损坏sqlite数据库?
我也是。我注意到一个问题,当尝试使用uid列选择歌曲时,它不会返回任何行;例如:可能损坏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错误?这是怎么发生的?我不认为这是腐败的迹象,
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)选择适当的行。结果输出为:-
- 注意,
返回false,但所有其他比较返回1,即true,因此为匹配'yzoiaVuicn5ISq1+4DaKGbM3trht/z/ONNm+vA='=uid AS reversematch
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传递。我相信把它放在弦上会解决我的问题。