Возможно повреждена база данных sqlite?
Итак, у меня есть эта база данных SQLite3. Я заметил проблему, что при попытке выбрать песни, используя столбец uid, он не возвращает никаких строк; например:
SELECT * FROM songs WHERE uid = 'yzoiaVuicn5ISq1+4DaKGbM3trht/z/ONNm+vA=='
Хотя ряд с данным идентификатором существует. Замена '=' на 'LIKE' возвращает правильную строку.
Я смог исправить это с помощью:
UPDATE songs SET uid = uid || ''
Это типичный случай коррумпированных БД? Или это может быть ошибка sqlite? Как это могло случиться?
1 ответ
Я не верю, что это признак коррупции, а скорее как = обрабатывается.
Например, рассмотрим следующее:
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=='
результаты в:-
Следовательно, преобразование столбца в тип TEXT явно (CAST) или неявно (некоторые функции, такие как TRIM) решает проблему. Обратите внимание, что SUBSTR возвращает байты из BLOB, поэтому не будет преобразовывать тип столбца и, следовательно, substr(uid,1)
не работает
Заметка
Выполнение вышеупомянутого условия where указывает, что некоторые строки имеют тип столбца TEXT для столбца uid, согласно:-