gpt4 book ai didi

sqlite - 可能损坏的sqlite数据库?

转载 作者:行者123 更新时间:2023-12-03 19:17:10 24 4
gpt4 key购买 nike

所以我有this SQLite3 database。我注意到一个问题,当尝试使用uid列选择歌曲时,它不返回任何行;例如:

SELECT * FROM songs WHERE uid = 'yzoiaVuicn5ISq1+4DaKGbM3trht/z/ONNm+vA=='


即使存在具有给定uid的行。用'LIKE'代替'='返回正确的行。

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

UPDATE songs SET uid = uid || ''


这是数据库损坏的典型情况吗?还是一个sqlite bug?这怎么可能发生?

最佳答案

我不认为这表明腐败,而是=的处理方式。
例如,考虑以下内容:

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)选择适当的行。结果输出为:
enter image description here

注意 '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=='

结果是 :-
enter image description here
因此,将列显式(CAST)或隐式转换为TEXT类型(某些功能(如TRIM))可以解决此问题。请注意,SUBSTR从BLOB返回字节,因此不会转换列类型,因此 substr(uid,1)不起作用。

注意
在上面运行较少的where子句,表明某些行的uid列的列类型为TEXT,如下所示:
enter image description here

关于sqlite - 可能损坏的sqlite数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52046408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com