SQLite3 поддерживает типы данных. Смотри https://www.sqlite.org/datatype3.html
Они не связаны строго с объявленным типом столбца, а скорее индивидуальны для каждого значения ячейки. Тип определяется тем, как он был создан / изменен. Например, если вы вставите 5, это будет INTEGER. Если вы вставите 5.5, это будет РЕАЛЬНО. Если вы вставите 'test', это будет TEXT, если вы вставите zeroblob (1), это будет BLOB, а если вы добавите null, это будет NULL.
Теперь вы пытаетесь объединить текущее значение с типом BLOB. Если текущим значением является TEXT (или, по сути, если вы используете оператор ||, как вы это делаете, вы конвертируете любой тип в TEXT), оно будет объединено с байтом \ x00, который фактически определяет конец строки. Другими словами, вы добавляете еще один терминатор строки к уже существующему типу TEXT.
Не будет никаких изменений на выходе этой операции. TEXT всегда заканчивается нулем байта и всегда исключается из результата, так как это метасимвол, а не само значение.
Дополнительная информация от http://sqlite.1065341.n5.nabble.com/Append-data-to-a-BLOB-field-td46003.html - добавление двоичных данных в поле BLOB невозможно. Вы можете изменить предварительно выделенный BLOB-объект:
Добавить невозможно. Но если вы предварительно выделите место с помощью
zeroblob () или аналогичный, вы можете написать в него, используя
API BLOB-объектов:
http://www.sqlite.org/c3ref/blob_open.html
Наконец, смотрите принятый ответ, так как автор вопроса нашел интересное решение.