https://www.sqlite.org/datatype3.html является необходимым чтением для понимания того, как работает Sqlite.Ваш вопрос говорит о том, что вы его не читали.
Я обнаружил, что все коды и типы номеров VARCHAR
Sqlite не имеет типа VARCHAR
;когда он используется в определении столбца, он рассматривается как имеющий сходство TEXT
, поскольку в нем есть строка "CHAR".Но вы вставляете BLOB
в таблицу.Sqlite не будет преобразовывать большой двоичный объект в любой другой тип при сохранении его в таблице, независимо от сродства столбца.
В первые три SELECT
s вы затем сравниваете большой двоичный объект в таблице (X'5000154130'
) к текстовому значению ('5000154130'
), используя =
.Это сравнение никогда не будет правдой:
Из документации (выделение добавлено):
Результаты сравнения зависят от классов хранения операндов, согласно следующемуправила:
Значение с классом хранения NULL считается меньшим, чем любое другое значение (включая другое значение с классом хранения NULL).
AnЗначение INTEGER или REAL меньше любого значения TEXT или BLOB.Когда INTEGER или REAL сравнивается с другим INTEGER или REAL, выполняется числовое сравнение.
Значение TEXT меньше значения BLOB .Когда сравниваются два значения TEXT, для определения результата используется соответствующая последовательность упорядочения.
При сравнении двух значений BLOB результат определяется с помощью memcmp ().
Ваш четвертый ... тоже не должен совпадать.Это не в моем тестировании.Даже если sqlite обрабатывает BLOB-объект как текст в случае LIKE
, сравниваемые значения не совпадают (BLOB-объект X'0102'
- это байты 0x01 0x02
, строка '0102'
- это байты 0x30 0x31 0x30 0x32
)
По сути, если вы хотите рассматривать эти значения как строки, не вставляйте их как BLOB-объекты.Если вы не можете это контролировать, ищите записи, сравнивая их с соответствующими каплями, а не со строками.
Редактировать:
Я не знаю, что вы подразумеваете под экспортировал запись , но NTAwMDE1NDEzMAA=
- это кодировка Base64 строки '5000154130'
(UAAVQTA=
- это кодировка Base64 blob X'5000154130'
).